Часть 2. Я начинающий, подскажите как...(Все вопросы начинающих!!!)
ListBox1->Columns=3;
каким образом записать строку в второй и третий столбцы?
//конвертируем текущие данные в "удобочитаемый" формат
// string[] qOpen = Open[0].ToString().Split(',');
// string[] qClose = Close[0].ToString().Split(',');
// string[] qHigh = High[0].ToString().Split(',');
// string[] qLow = Low[0].ToString().Split(',');
double M1= AAos(9, 1, 5, 1).Med1[0]; // расчитываю индикаторы
double M2= AAos(7, 1, 5, 1).Med1[0];
double M3= AAos(5, 1, 5, 1).Med1[0];
double M4= AAos(3, 1, 5, 1).Med1[0];
string[] qM1 = M1.ToString().Split(',');
string[] qM2 = M2.ToString().Split(',');
string[] qM3 = M3.ToString().Split(',');
string[] qM4 = M4.ToString().Split(',');
// string pOpen;
// string pClose;
// string pHigh;
// string pLow;
string pM1;
string pM2;
string pM3;
string pM4;
// if (qOpen.Length == 2) {pOpen = qOpen[0]+"."+qOpen[1];}
// else{pOpen = Open[0].ToString();}
//
// if (qClose.Length == 2) {pClose = qClose[0]+"."+qClose[1];}
// else { pClose = Close[0].ToString(); }
//
// if (qHigh.Length == 2) {pHigh = qHigh[0]+"."+qHigh[1];}
// else { pHigh = High[0].ToString(); }
//
// if (qLow.Length == 2){pLow = qLow[0]+"."+qLow[1];}
// else {pLow = Low[0].ToString();}
if (qM1.Length == 2) {pM1 = qM1[0]+"."+qM1[1];}
else{pM1 = M1.ToString();}
if (qM2.Length == 2) {pM2 = qM2[0]+"."+qM2[1];}
else{pM2 = M2.ToString();}
if (qM3.Length == 2) {pM3 = qM3[0]+"."+qM3[1];}
else{pM3 = M3.ToString();}
if (qM4.Length == 2) {pM4 = qM4[0]+"."+qM4[1];}
else{pM4 = M4.ToString();}
//Пишем новую строку в файл.
string str;
str =
Time[0].Date.ToString()+ ";"
// + Time[0].Hour.ToString()+Time[0].Minute.ToString()
+Time[0].Second.ToString()+";"+
pM1+";"+pM2+";"+pM3+";"+pM4;
FileStream ot = new FileStream(@"C:\data.txt", FileMode.Append);
StreamWriter output = new StreamWriter(ot);
output.WriteLine(str);
output.Close();
ot.Close();
дебаггером проходили код? на какой строчке падает? а почему string с маленькой, вроде ж с большой был?
Иконка берется из ресурсов.
Иконка берется из ресурсов.
Могу предложить такой вариант. Меняем прозрачность элемента. Это похоже на затенение.
<Grid Name="grid">
<Image Name="image" Source="pic.jpg"></Image>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Text</TextBlock>
</Grid>
</Button>
Гриду и имиджу даны названия. Через них можно в нужном месте менять прозрачность.
// или
image.Opacity = 0.3;
Когда пользователь выбирает элемент, то здесь все просто. Но может быть и так, что меняется "модель", то есть SelectedItem нужно установить в коде. В этом у меня и проблема, не могу из кода достучаться до Combobox'а: пробовал проходить по визуальному дереву, логическому, но так и не получилось. Ну а вторая мысль - устанавливать не из кода, а сделать привязку к TextBox к свойству Text, например. Но тут тоже ничего не добился. Помогите разобраться с этим.
Вот примерный код, лишнее повыкидывал:
[CODE="xml"]<Window.Resources>
<local:TrendsList x:Key="TrendsListKey"/>
<DataTemplate x:Key="TrendsViewTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
...
<ColumnDefinition Width="470"/>
...
</Grid.ColumnDefinitions>
<Border Grid.Column="1">
<TextBox Text="{Binding Path=TrendName}" Name="TrendName" IsReadOnly="True" MouseEnter="TrendName_MouseEnter">
</TextBox>
</Border>
<Border Grid.Column="1">
<ComboBox Name="AllTrendsCombo" Visibility="Collapsed" MouseLeave="AllTrendsCombo_MouseLeave" ItemsSource="{Binding Source={StaticResource TrendsListKey}}" SelectionChanged="AllTrendsCombo_SelectionChanged" >
<ComboBox.DisplayMemberPath>Value</ComboBox.DisplayMemberPath>
</ComboBox>
...
</Grid>
</DataTemplate>
</Window.Resources>
<Grid>
<Expander Name="Expander1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border >
<ScrollViewer >
<ListView Name="TrendsPanel" ItemTemplate="{StaticResource TrendsViewTemplate}" SelectionMode="Single">
</ListView>
</ScrollViewer>
</Border>
</Grid>
</Expander>
</Grid>[/CODE]
[CODE="Csharp"]public class TrendsList : ObservableCollection<KeyValuePair<Guid, string>>
{
public TrendsList() : base() { }
}[/CODE]
Прочёл С++ Без страха, книга легко далась так как имею опыт программирования в php и ActionScript3.0
и всё примеры прекрасно компилируется и работает.
Решил заняться оконными приложениями первое с чем начал работать это Windows Forms
но меня тут же отговорили сказали учить win32 и API.
И тут пошла трабола все примеры из книг и из интернета по созданию простого окна тупо не работают
ни в DevC++ ни в VC2008 сначала думал что ошибки в книгах но потом скопировал код проекта
с DevC++ в VC2008 и та же ерунда целая гора ошибок хотя в DevC++ всё нормально компилируется!
Прошу спецов подсказать нормальную книгу по которой хотя бы в одном
компиляторе всё будет работать и можно будет писать полноценные приложения.
Желательно с нормальными объяснениями каждого этапа а не кучу кода и всего парой строк
пояснения.
Ссылку на страницу с литературой не кидать я от туда и без того многовато скачал
интернет не безлимитный!
Что касается C++. Нормальные книги почти все. Но дело в том, что во всех компиляторах ни один пример не будет компилироваться без изменения настроек по умолчанию.
Если книга десятилетней давности, а среда разработки новая, то проблема может быть, например, в том, что в книге код приведён с простыми строковыми литералами, а современные IDE зачастую по умолчанию настроены на юникод. Достаточно изменить настройки, и пример скомпилируется.
Пиши, в какой IDE какая конкретно ошибка выдаётся. Приводи пример кода (только не портянку на весь экран!). Возможно, подскажем, какую настройку исправить.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hlnstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hMainWnd;
char szClassName[]="MyClass";
MSG msg;
WNDCLASSEX wc;
wc.cbSize =cizeof(wc);
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc =WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInstance;
wc.hIcon =LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName =NULL;
wc.lpszClassName =ClassName;
wc.hIconSm =LoadIcon(NULL, IDI_APPLICATION);
//регестрируем класс окна
if(!RegisterClassEx(&wc))
{
MessageBox (NULL,"Неудалось зарегистрировать окно","Ошибка",MB_OK);
return 0;
}
//Создаём основное окно
hMainWnd = CreateWindow(
szClassName,"ЗДОРОВ",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,
(HWND)NULL,(HMENU)HULL,
(HINSTANCE)hInstance,NULL
);
if(!hMainWnd)
{
MessageBox (NULL,"Неудалось создать окно","Ошибка",MB_OK);
return 0;
}
//Показываем окно
ShowWindow(hMainWnd, nCmdShow);
//Цикл обработки сообщений
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
{
HDC hDC;
PAINTSTRUST ps;
RECT rect;
switch (uMsg)
{
case WM_PAINT:
hDC=BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rect);
DrawText(hDC, "ПРИВЕТ ПРОГРАММИСТУ", -1, &rect,DT_SINGELINE|DT_VCENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,uMsg, wParam, lParam);
}
return 0;
}
Ошибки в DevC++
1) In function `int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':
2) `cizeof' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
3) `hInstance' undeclared (first use this function)
4) `ClassName' undeclared (first use this function)
5) At global scope:
6) expected unqualified-id before '{' token
7) expected `,' or `;' before '{' token
Ошибки в VC2008
: error C3861: 'cizeof': identifier not found
: error C2065: 'hInstance' : undeclared identifier
: error C2065: 'ClassName' : undeclared identifier
: error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [32]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
: error C2065: 'hInstance' : undeclared identifier
: error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [23]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
: error C2447: '{' : missing function header (old-style formal list?)
В остальных примерах ошибки таки же.
Сори не разобрался как сжать окошко с кодом.
Необходимо чтобы при загрузке формы текстовые поля выставлялись значениями по умолчанию, это без проблем.
Далее данные из этих текстовых полей должны использоваться в других классах, вот здесь и начались проблемы.
Всего два класса где должны использоваться эти данные, вот как их туда перетащить.
Я создавал экземпляр формы в этих классах, но при этом происходит инициализация компонентов со значениями по умолчанию, т.е. если изменить значения текстовых полей то эти изменения не возможно передать другим классам.
Еще перепробовал несколько способов некоторые из которых частично работали, но это не тру, хотелось бы узнать как правильно передавать значения из элементов формы в другие классы.
Заранее спасибо!
1) In function `int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':
2) `cizeof' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
3) `hInstance' undeclared (first use this function)
4) `ClassName' undeclared (first use this function)
указывает на кучу опечаток
cizeof - sizeof
hlnstance - hInstance
ClassName - szClassName
HULL - NULL
Лишняя ; после WndProc
PAINTSTRUST - PAINTSTRUСT
DT_SINGELINE - DT_SINGLELINE
После их исправления в DevC++ всё работает.
Как я и ожидал, литералы неюникодные. Чтобы пример скомпилировался в VisualStudio, нужно в настройках проекта вместо Unicode поставить Multi-Byte Character Set.
Здесь возможны такие сценарии:
1. У вас есть главное окно программы с меню. При выборе пользователем определенного его пункта открывается диалоговое окно с текстовыми полями, куда пользователю предлагается ввести какие-то данные. По окончании ввода пользователь нажимает кнопку ОК и диалог закрывается. После этого класс основного окна получает данные, которые ввел пользователь в диалоге.
Пример:
[CODE=C#]
public partial class Form1 : Form
{
// Строковая переменная для хранения данных,
// полученных от пользователя.
private string userInfo;
public Form1()
{
InitializeComponent();
userInfo = string.Empty;
}
// Пользователь выбрал пункт меню "Get info..."
private void getInfoMenuItem_Click(object sender, EventArgs e)
{
// Создаем диалог, показываем его и ждем результата.
GetInfoDialog gid = new GetInfoDialog();
if (gid.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// Если пользователь подтвердил ввод данных,
// то получаем их.
userInfo = gid.UserInfo;
// Вывод данных.
if (userInfo.Length > 0)
{
this.Text = userInfo;
}
}
}
}
[/CODE]
[CODE=C#]
public partial class GetInfoDialog : Form
{
// Переменная для сохранения результата
// ввода в текстовое поле.
private string userInfo;
// Свойство для получения значения
// закрытого поля userInfo другими классами.
public string UserInfo
{
get { return userInfo; }
}
public GetInfoDialog()
{
InitializeComponent();
userInfo = string.Empty;
}
// Пользователь подтвердил ввод, нажав кнопку ОК.
private void btnOK_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length > 0)
{
// Если поле для ввода не пустое...
userInfo = textBox1.Text;
}
}
}
[/CODE]
2. Текстовые поля находятся в главном окне программы. По окончании ввода пользователь нажимает кнопку Submit и класс главного окна обновляет переменные всех заинтересованных классов через общедоступные свойства. Пример:
[CODE=C#]
public partial class Form1 : Form
{
// Строковая переменная для хранения данных,
// полученных от пользователя.
private string userInfo;
// Объект класса-получателя данных.
private Receiver rec;
public Form1()
{
InitializeComponent();
userInfo = string.Empty;
// Инициализация объекта класса-получателя данных.
rec = new Receiver();
}
// Пользователь нажал кнопку "Submit".
private void btnSubmit_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length > 0)
{
// Если пользователь ввел какие-то данные...
userInfo = textBox1.Text;
// Передаем данные классу-получателю
// через публичное свойство.
rec.UserInfo = userInfo;
}
}
}
[/CODE]
[CODE=C#]
public class Receiver
{
// Переменная для хранения пользовательских данных.
private string userInfo;
// Свойство для получения и установки userInfo.
public string UserInfo
{
get { return userInfo; }
set
{
userInfo = value;
// Здесь располагается реакция
// класса на ввод данных пользователем.
MessageBox.Show(userInfo);
}
}
public Receiver()
{
userInfo = string.Empty;
}
}
[/CODE]
Microsoft рекомендует для получения данных от пользователя использовать сценарий №1, но я думаю, что сценарий №2 тоже имеет право на реализацию. Можно также совместить оба варианта, создав диалог для получения данных, а затем раздать эти данные ожидающим объектам других классов.
Есть и еще один вариант: создать класс-контроллер, который в свою очередь создает все прочие классы (главного окна, диалогов и т.д.). В этом случае окно ввода данных должно генерировать событие, на которое подписывается контроллер. Контроллер затем рассылает данные всем заинтересованным классам.
[CODE=C#]
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Controller());
}
}
[/CODE]
[CODE=C#]
public partial class Form1 : Form
{
// Строковая переменная для хранения данных,
// полученных от пользователя.
private string userInfo;
// Свойство для получения значения userInfo.
public string UserInfo
{
get { return userInfo; }
}
// Делегат и событие для оповещения о завершении
// пользовательского ввода.
public delegate void UserInfoHandler(object sender, EventArgs e);
public event UserInfoHandler OnUserInput;
public Form1()
{
InitializeComponent();
userInfo = string.Empty;
}
// Пользователь нажал кнопку "Submit".
private void btnSubmit_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length > 0)
{
// Если пользователь ввел какие-то данные...
userInfo = textBox1.Text;
if (OnUserInput != null)
{
// Если есть подписчики события...
OnUserInput(this, new EventArgs());
}
}
}
}
[/CODE]
[CODE=C#]
public class Controller : ApplicationContext
{
// Объект главного окна приложения.
private Form1 mainForm;
// Объект класса-потребителя.
private Receiver receiver;
public Controller()
{
// Создаем объекты главного окна приложения
// и класса-потребителя данных.
mainForm = new Form1();
receiver = new Receiver();
// Делаем mainForm главным окном контекста приложения.
// Если главное окно закрывается, приложение также закроется.
this.MainForm = mainForm;
// Подписываемся на оповещение о событии пользовательского ввода.
mainForm.OnUserInput += new Form1.UserInfoHandler(mainForm_OnUserInput);
// Показываем главное окно.
mainForm.Show();
}
// Обработчик события пользовательского ввода.
private void mainForm_OnUserInput(object sender, EventArgs e)
{
// Приводим sender к типу Form1.
Form1 form = sender as Form1;
if (form != null)
{
// Если отправитель подтвержден,
// передаем данные потребителю.
receiver.UserInfo = form.UserInfo;
}
}
}
[/CODE]
Код класса-потребителя остается тот же, что в предыдущем примере.
Как-то так, по-моему...
Graphics ^im = this->CreateGraphics();
im->Clear(col->White);
for(int i=0;i<300;i++){
int fg=Random().Next(0,255);
Pen ^pen=gcnew Pen(Color::FromArgb(255,fg,fg,fg));
im->DrawLine(pen,1,i,300,i);
Если выводить подобным образом линии на экран то можно заметить что
на продолжение нескольких итераций цикла функция Random() выдаёт одно и
тоже число.
Вопрос как этого избежать не оказывая большой нагрузки на систему?
Так же это можно увидеть если в форму добавить текстовое поле label1
и в цикле прописать.
На другом форуме предлагали такой вариант.
Graphics ^im = this->CreateGraphics();
im->Clear(col->White);
Random ^rnd = gcnew Random();
for(int i=0;i<300;i++){
int fg=rnd->Next(0,255);
Pen ^pen=gcnew Pen(Color::FromArgb(255,fg,fg,fg));
im->DrawLine(pen,1,i,300,i);
но он не даёт не каких результатов как и вынос
функции ранодом в отдельную функцию.
Как сделать так чтоб функция рандом выдавала на каждой итерации цикла
разные числа?:confused:
Тут как я думаю нужно что то что будет менять число исходя из
тиков процессора но для меня эт тёмный лес :)
Так же маленький вопросик можно ль код и функции
написанные на голом с++ в виде классов присоединять
к проектам на C++/STL в книжках чёт не нашёл хотя по идее должен
быть способ)))
тоже число.
Во-первых, то, что вы назвали функцией, на самом деле является конструктором класса. Из этого следует, что правильно применять объект этого класса вам посоветовали "на другом форуме".
Во-вторых, погоняв метод Next() упомянутого класса в менее специфических условиях, я не обнаружил явных повторов на протяжении более 30 итераций цикла, на каждой из которых генерировалось по 300 чисел от 0 до 255.
написанные на голом с++ в виде классов присоединять
к проектам на C++/STL в книжках чёт не нашёл хотя по идее должен
быть способ)))
А разве STL не является стандартной библиотекой C++? Может, вы что-то иное имели ввиду - например, C++/CLI?
Во-вторых, погоняв метод Next() упомянутого класса в менее специфических условиях, я не обнаружил явных повторов на протяжении более 30 итераций цикла, на каждой из которых генерировалось по 300 чисел от 0 до 255.
Если бы небыло повторений я бы не задавал вопрос!
С помощью элемента label очень чётко видно повторяющееся цепочки чисел
так же на изображение очень отчётливо видно что числа повторяются так как полосы
одного цвета толщиной не 1 пиксель а по 4 и более!
А разве STL не является стандартной библиотекой C++? Может, вы что-то иное имели ввиду - например, C++/CLI?
Да вы правы это библиотека на с++ но почти что весь код в приложение пишется через её классы
по которым увы нормальной литературы практически нету.
Мне гораздо проще написать функции и тд в собственных классах
и использовать в своём приложение.
P.S. MSDN не предлагать там самые простые функции описывают в таких примерах что чёрт ногу сломит!
так же на изображение очень отчётливо видно что числа повторяются так как полосы
одного цвета толщиной не 1 пиксель а по 4 и более!
А вы не думали о том, что в вашей программе могут содержаться ошибки? Четче всего цепочки чисел видны не в WinForms, а в консоли. Попробуйте:
{
Random^ rnd = gcnew Random();
bool quit = false;
while (!quit) {
for (int i = 0; i < 300; ++i) {
int fg = rnd->Next(0, 255);
Console::Write(fg + L"\t");
}
Console::WriteLine();
if (Console::ReadLine() == L"q") {
quit = true;
}
}
return 0;
}
По поводу литературы по STL - ее полно, на форуме есть отдельная тема, посвященная тому, что почитать. Вопрос слишком общий, чтобы его здесь раскрывать.
The default seed value is derived from the system clock and has finite resolution. As a result, different Random objects that are created in close succession by a call to the default constructor will have identical default seed values and, therefore, will produce identical sets of random numbers.
для избежания этого надо делать так как подсказали на форуме Random ^rnd = gcnew Random(); for(int i=0;i<300;i++){ int fg=rnd->Next(0,255); ...} либо самому указывать источник энтропии при создании экземпляра ( Random(int32) )
Чтобы не путаться, лучше не использовать на начальном этапе Visual Studio. Эта IDE позволяет писать на C++ под .NET. В итоге, как я неоднократно убеждался, новички мешают в кашу нативный и управляемый код.
Лучше сначала как следует освоить нормальный C++. Для этого взять IDE, например, CodeBlocks. Потому что DevC++ мягко говоря устарела. Потом, если будет желание познакомиться с платформой .NET, стоит обратить внимание на C#. И лишь после его освоения, можно будет при необходимости использовать C++/CLI - для одной-единственной цели: связи управляемого и неуправляемого кода.
Подскажите - а как корректно реализовать метод "ждать пока не..."?
Понятно, что используем цикл с проверкой по условию, но вот вопрос - если ожидание достаточно длительное (от 10 секунд до 140) что лучше - оставить цикл пустым или вставить в него Thread.Sleep(1000);? Очень меня напрягает эта вот заморозка процесса...
{
if(action)
break;
Thread.Sleep(10);
}
Но лучше есессно ждать конкретных действий (типа waitforsingleobject, хз что там в c# и что для конкретной задачи подходит -ожидание пользов. действий/данных из сети/win-сообщения )
{
if(action)
break;
Thread.Sleep(10);
}
Но лучше есессно ждать конкретных действий (типа waitforsingleobject, хз что там в c# и что для конкретной задачи подходит -ожидание пользов. действий/данных из сети/win-сообщения )
Нда. Печально.
Я тут взялся переписывать AutoIt на C#. Погряз в WinAPI'хах. -_- А поскольку в основном приходится работать с окнами - без задержек некуда. =\
Окей, еще два вопроса:
C#/WinAPI
1) Можно ли однозначно определить, что окно инициализировано и все компоненты в нем созданы? Реализовал метод "ждать окно с... название\класс\содержимое". В основном хватает только названия, но иногда, в случае с диалогами, приходится ориентироваться и на содержимое. То в, свою очередь, представляет собой строку, собранную из результатов GetText для всех дочерних "окон" (контролов). Контролы собираются при первом обращении к ним. И вот когда я перечисляю все окошки, сравниваю их по имени, по классу... и, если доходит до сравнения по содержимому, то оказывается, что собираю я их быстрее, чем те успевают появиться. Сейчас проблема решена путем окастылевания: Thread.Sleep(500). Но это, конечно, очень плохой вариант. Особенно если когда-нибудь появится необходимость найти нужное окошко среди двух десятков с одинаковым именем. Что делать?
2) Нет ли у кого на примете готового класса, способного набирать текст в неактивных окошках? Наработки у меня есть. Грмоздкая обертка вокруг винапишных Send\Post Message. Но 1) Мне очень не нравится то, как я реализовал распознавание русских букв и смену раскладки. 2) Хочется чтобы это чудо брало на себя функции по распределению нажатий на кнопочки. К примеру, чтобы нажатие на Alt в блокноте делало активным меню, а обычные буквы посылались в его Edit1. Вообще возможно ли это? Сейчас пользуюсь другим методом - который работает только с активными окнами.
...
Я ведь правильно понимаю, что эта штука должна сама приостановить процесс из которого была вызвана и оживить его когда окошко станет инпутабельным?
Имеем следующий вопрос (который не отменяет предыдущие :D) как правильно создавать синглтоны в C#?
Нет, то что правильно их не создавать вообще - эт понятно. Но вот надо! :) Вики предлагает три варианта:
Пример на C#
Для отложенной инициализации Singleton'а в C# рекомендуется использовать конструкторы типов (статический конструктор). CLR автоматически вызывает конструктор типа при первом обращении к типу, при этом обеспечивая безопасность в отношении синхронизации потоков. Конструктор типа автоматически генерируется компилятором и в нем происходит инициализация всех полей типа (статических полей). Явно задавать конструктор типа не следует, так как в этом случае он будет вызываться непосредственно перед обращением к типу и JIT-компилятор не сможет применить оптимизацию (например, если первое обращение к Singleton'у происходит в цикле).
/// <typeparam name="T">Singleton class</typeparam>
public class Singleton<T> where T : class
{
/// Закрытый конструктор по умолчанию необходим для того, чтобы
/// предотвратить создание экземпляра класса Singleton
private Singleton() { }
/// Фабрика используется для отложенной инициализации экземпляра класса
private sealed class SingletonCreator<S> where S : class
{
//Используется Reflection для создания экземпляра класса без публичного конструктора
private static readonly S instance = (S) typeof(S).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[0],
new ParameterModifier[0]).Invoke(null);
public static S CreatorInstance
{
get { return instance; }
}
}
public static T Instance
{
get { return SingletonCreator<T>.CreatorInstance; }
}
}
/// Использование Singleton
public class TestClass : Singleton<TestClass>
{
private TestClass() { }
public string TestProc()
{
return "Hello World";
}
}
Также можно использовать стандартный вариант потокобезопасной реализации Singleton с отложенной инициализацией:
{
/// Защищенный конструктор нужен, чтобы предотвратить создание экземпляра класса Singleton
protected Singleton() { }
private sealed class SingletonCreator
{
private static readonly Singleton instance = new Singleton();
public static Singleton Instance { get { return instance; } }
}
public static Singleton Instance
{
get { return SingletonCreator.Instance; }
}
}
Если нет необходимости в каких либо публичных статических методах или свойствах (кроме свойства Instance), то можно использовать упрощенный вариант:
{
private static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get { return instance; }
}
Естественно, больше всего привлекает последний вариант (коим отродясь и пользовался). Но в связи с этим очень смущает такой вопрос - а почему в нем нельзя использовать статичные методы?
/// Защищенный конструктор нужен, чтобы предотвратить создание экземпляра класса Singleton
protected Singleton() { }
}
---
[SIZE="5"]Вопрос снимается. :) Все перечисленные решения устарели.[/SIZE]
{
private static readonly Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton());
private Singleton() { }
public static Singleton Instance
{
get { return instance .Value; }
}
}
Господа, еще вопросик. Как бы универсализировать SendMessage/PostMessage? Дело в следующем. В качестве параметров передаются различные типы данных - целые числа, беззнаковые, указатели, строки, стрингбилдеры... И вот это чудище мне не нравится... А в перспективе перехода на перечисления она еще разрастется... В общем, хочется все это сжать в один метод. Вопрос - как?
public static extern IntPtr SendMessage(IntPtr handle, uint wm, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr handle, WindowMessage wm, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr handle, WindowMessage wm, uint wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr handle, WindowMessage wm, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr handle, WindowMessage wm, int wParam, StringBuilder lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr handle, WindowMessage wm, int wParam, string lParam);
Шаблон описан так:
[CODE="xml"]<DataTemplate x:Key="ViewTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
...
</Grid>
</DataTemplate>[/CODE]
Окно:
[CODE="xml"]<Grid>
<Expander>
<Grid>
<Grid.RowDefinitions>
...
</Grid.RowDefinitions>
<Border>
Вот он не прокручивается колесиком:
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ListView ItemTemplate="{StaticResource ViewTemplate}" SelectionMode="Single">
</ListView>
</ScrollViewer>
</Border>
</Grid>
</Expander>
...
</Grid>[/CODE]
#include<conio.h>
void main(){
//Даны целые числа a1, a2, a3, a4 . Получите целочисленную квадратную матрицу [bi j], у которой bi j =ai -3aj (i,j=1,2,3,4).
int a1,a2,a3,a4,i,n=1;
int amas[4]={a1,a2,a3,a4};
for (i=0;i<=3;i++)
{printf("Vvedite chislo %d ", n);
scanf("%d", amas);
n++;
}
printf("Vi vveli chisla %d; %d;%d;%d ", a1,a2,a3,a4);
}
Код написал, чтобы было меньше строк по вводу-выводу чисел.При компиляции этой части кода выбивает ошибку, т.е. Vvedite chislo 1_ ввел Vvedite chislo 2_ снова ввел. И "ошибка приложения".
Код написал, чтобы было меньше строк по вводу-выводу чисел.При компиляции этой части кода выбивает ошибку, т.е. Vvedite chislo 1_ ввел Vvedite chislo 2_ снова ввел. И "ошибка приложения".
ошибка тут. Прочитайте помощь по функции и посмотрите примеры использования
Переписал со взятием адреса, т.е.
Ввод идет нормально. Теперь немножко проблема с выводом, например если вводишь числа типа 1,2,3,4. На выходе получаем:
[CENTER]Vvedite chislo 1 0
Vvedite chislo 2 1
Vvedite chislo 3 2
Vvedite chislo 4 6
Vi vveli chisla 2293592;4200342;4200240;3342445
[/CENTER]
В сети достаточно примеров написания самой программы. Например такой:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Web;
using HtmlAgilityPack;
namespace primer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("ваш url");
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]");
if (nodes == null)
return;
foreach (HtmlNode node in nodes)
{
listBox1.Items.Add(node.Attributes["href"].Value);
}
}
}
}
Эта программка выводит в listbox все ссылки: "//a[@href]", а мне, как я писал, нужны в блоке quote. Пытался найти внятные примеры использования HtmlAgilityPack. Варианты типа "/HTML/body//a[@href]" приводят только к пустой nodes. Буду рад любой подсказке, Не обязательно даже quote, можно и body, я думаю в этом случае переделать под свои нужды будет легче.
// но что-то похожее должно быть
int startPoint= s.IndexOf("<body>");
int endPoint= s.IndexOf("</body>");
s = s.Substring(startPoint,endPoint);
получиться обрезанная дока.Можно использовать регулярки
@"\<body\b[^>]*\>\s*(?<Title>[\s\S]*?)\</body\>",
RegexOptions.IgnoreCase).Groups["body"].Value;
А потом
И ищи свои ссылки уже там.
А вообще, хватило б для этого одних только регулярок.
это обычный xpath. Изучите его уже и пользуйте как вздумается.
// но что-то похожее должно быть
int startPoint= s.IndexOf("<body>");
int endPoint= s.IndexOf("</body>");
s = s.Substring(startPoint,endPoint);
получиться обрезанная дока.Можно использовать регулярки
@"\<body\b[^>]*\>\s*(?<Title>[\s\S]*?)\</body\>",
RegexOptions.IgnoreCase).Groups["body"].Value;
А потом
И ищи свои ссылки уже там.
А вообще, хватило б для этого одних только регулярок.
спасибо за совет, у HtmlDocument есть такой метод, только прописывается ToString().
Попробовал первый вариант, у меня получился такой код:
HtmlAgilityPack.HtmlDocument doc = web.Load("URL");
string s = doc.ToString();
int startPoint = s.IndexOf("<body>");
int endPoint = s.IndexOf("</body>");
s = s.Substring(startPoint, endPoint);
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]");
if (nodes == null)
return;
foreach (HtmlNode node in nodes)
{
listBox1.Items.Add(node.Attributes["href"].Value);
}
}
На строке s = s.Substring(startPoint, endPoint); выдает ошибку. startPoint и endPoint показывает: -1.
Регулярные выражения не менее сложны, а я в будущем планирую более сложный проект. В случаи с HtmlAgilityPack надеялся что можно прописать уточнение выбранного в строке HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]"); Правда метод обрезки тоже нормальный, подскажите пожалуйста почему выдает -1, может просто не находит тег <body>.
На этой странице по ссылке я уже кажется живу. Сложно что-то понять без реальных примеров. Если не сложно напишите пару-тройку любых понятных путей.
Тег <body> может иметь параметры, например - <body onload="if (document.body.scrollIntoView && fetch_object('currentPost')>. (взято с этого форума ;)))
Потому попробуйте искать так:
int endpoint = htmlPage.LastIndexOf("body>");