Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

опять проблемка в C#

1140  1 2 3 4 5 6 7 все
beautiful_man посетитель26.11.17 14:54
NEW 26.11.17 14:54 
в ответ maxxxl79 26.11.17 13:49
SendXPCommand(ar[0], ar[1]);

ar[1] не работало, ошибку показывало, добавил

int param;
int.TryParse(ar[1].Trim(), out param);

теперь выглядит так:


private async void readfile()
{
var lines = System.IO.File.ReadAllLines(@"data\738.chl");
foreach (var line in lines)
{
var text = line.Split(',')[0];
checkedListBox1.Items.Add(text);
await Task.Delay(500);
var matches = Regex.Matches(line, @"([\w+\s*\/\[\]]+,[\s*>?.?\d]+)");
foreach (Match match in matches)
{
var ar = match.Value.Split(',');
int param;
int.TryParse(ar[1].Trim(), out param);
SendXPCommands(ar[0],param);
await Task.Delay(500);
checkedListBox1.SetItemChecked(checkedListBox1.Items.Count - 1, true);
await Task.Delay(500);
}
}


и работает, maxxxl79 огромное спасибо.


ещё есть проблема с разбиранием массива:

параметер показан здесь

нужно извлечь текст из массива, массив от 0-40.

пробовал так:

взял параметр 5

SendXPCommands("sim/aircraft/view/acf_ICAO", 10, 5);

if (paramNum == 5)
{
char[] buf = new
char[binaryReader.BaseStream.Length - binaryReader.BaseStream.Position];
binaryReader.Read(buf, 0,
(int)(binaryReader.BaseStream.Length -
binaryReader.BaseStream.Position));
string ICAO = new string(buf);
ICAO = ICAO.Split(new[] { '\0' }, 2)[0];


#61 
maxxxl79 гость26.11.17 15:00
NEW 26.11.17 15:00 
в ответ beautiful_man 26.11.17 14:54
ar[1] не работало, ошибку показывало, добавил

Вы видимо не обновили метод SendXPCommand, там второй аргумент стал строковым, т.к. в примерах, которые привели встречалось ">0.0" - как такое должно обрабатываться Вы не пояснили, поэтому я для простоты примера просто передавал строку.

#62 
maxxxl79 гость26.11.17 15:06
NEW 26.11.17 15:06 
в ответ beautiful_man 26.11.17 14:54

насчет массива не совсем понял, по указанной ссылке там просто массив байт, надо представить это текстом?


тогда в зависимости от предполагаемой кодировки можно сделать просто:

string text = System.Text.Encoding.Default.GetString(bytes);


#63 
AlexNek патриот26.11.17 15:18
AlexNek
NEW 26.11.17 15:18 
в ответ maxxxl79 26.11.17 01:38
Не догадываюсь. Поделитесь. Интересно.

Если интересно открывайте новую тему, обсудим и var и прочие навороты.

А пока попробуйте перенести вашу строку в ресурсы.

#64 
maxxxl79 гость26.11.17 17:22
NEW 26.11.17 17:22 
в ответ AlexNek 26.11.17 15:18

ну, во-первых, не вся работа со строками крутится вокруг ресурсов. во-вторых, если уж принципиально надо использовать интерполяцию и ресурсы, то почему нельзя хранить в ресурсах статическую часть (если надо, локализованную), а подстановку делать в интерполяции, для String.Format ведь все равно подставляете аргументы в коде, что и неудивительно, учитывая, что интерполяция является всего лишь синтаксическим сахаром к String.Format.


#65 
AlexNek патриот26.11.17 17:55
AlexNek
NEW 26.11.17 17:55 
в ответ maxxxl79 26.11.17 17:22
если уж принципиально надо использовать интерполяцию и ресурсы, то почему нельзя хранить в ресурсах статическую часть (если надо, локализованную), а подстановку делать в интерполяции

А можно пошаговую инструкцию для программиста по локализации проекта сделанного "любителем последних извращений"?


#66 
maxxxl79 гость26.11.17 18:11
NEW 26.11.17 18:11 
в ответ AlexNek 26.11.17 17:55

Вы не нервничайте, а то ещё немного и похоже на личности перейдете :) Вы выдаете какой-то обобщенный тезис, а потом хватаетесь за частные случаи. Я согласен, что интерполяция не несет преимуществ для задач локализации строк из ресурсов. Под тем, что Вы процитировали, я имел в виду просто вариант:

Console.WriteLine($@"{Properties.Resources.Command} {command}");

как пример.


Но раз уж Вы решили теперь удариться в конкретику, скажите, как в конкретной задаче слепка строки, которая состоит только из динамических данных (например, того же входного текстового файла или БД) я должен использовать ресурсы? Что собственно я должен в этих ресурсах в этом случае хранить, к чему Вы о них заговорили?


#67 
AlexNek патриот26.11.17 18:24
AlexNek
NEW 26.11.17 18:24 
в ответ maxxxl79 26.11.17 18:11
что интерполяция не несет преимуществ для задач локализации строк из ресурсов

Я как то не вижу особых преимуществ интерполяции вообще ни в одной задаче, по сравнению с теми недостатками которые создает это использование.


#68 
beautiful_man посетитель26.11.17 19:09
NEW 26.11.17 19:09 
в ответ maxxxl79 26.11.17 15:06

maxxxl79 с массивами разобрался,

если будут ещё какие нибудь вопросы,

здесь стукну, или лучше в личку тебе?

#69 
maxxxl79 гость26.11.17 19:31
NEW 26.11.17 19:31 
в ответ beautiful_man 26.11.17 19:09

мне без разницы, можно и в личку, а если хочется узнать критическое мнение других участников форума, то здесь :)


#70 
beautiful_man посетитель05.12.17 16:17
NEW 05.12.17 16:17 
в ответ maxxxl79 26.11.17 19:31

Привет всем,


не подскажет кто нибудь, как использовать число из стринга в "Thread.Sleep()"?


Например из файла прочитал число "1000" или "1",

передал в "string wait;"

и в "Thread.Sleep(wait)" использовать.


Время для паузы стоит в файле, как преобразовать в миллисекунды не пойму.


#71 
Программист коренной житель05.12.17 16:48
NEW 05.12.17 16:48 
в ответ beautiful_man 05.12.17 16:17

int.Parse () - может бросить исключение

int.TryParse() - исключение не бросает :)

#72 
Murr патриот05.12.17 19:39
Murr
NEW 05.12.17 19:39 
в ответ beautiful_man 05.12.17 16:17

как использовать число из стринга

-----

#2, строка 2?


преобразовать в миллисекунды

-----

Если читать именно то, что написано - ответом будет одно слово - nевозможно...

#73 
beautiful_man посетитель06.12.17 12:31
NEW 06.12.17 12:31 
в ответ Murr 05.12.17 19:39, Последний раз изменено 06.12.17 12:36 (beautiful_man)

Посмотрите пожалуйста код,


private void Chek()
{
var lines = System.IO.File.ReadAllLines("config.cfg");
foreach (var line in lines)
{
var matches = Regex.Matches(line, @"([\w+\s*\/\[\]]+,[\s*>?.?\d]+)");
foreach (Match match in matches)
{
var text = line.Split(',')[0];
checkedListBox1.Items.Add(text);
MessageBox.Show(text);
var ar = match.Value.Split(',');
int param;
int.TryParse(ar[1].Trim(), out param);
do
{
Thread.Sleep(500);
SendXPCommands(ar[0], param);
Thread.Sleep(500);
Thread XPRead = new Thread(new ThreadStart(chekCommand));
XPRead.Start();
SendXPCommands(ar[0], 10, param);
Thread.Sleep(500);
SendXPCommands(ar[0], 0, param);

}
while (resultat != param.ToString());
{
checkedListBox1.SetItemChecked(checkedListBox1.Items.Count - 1, true);
}
}
}
}

происходит всё как нужно, но если убираю:

MessageBox.Show(text)

проходит всю процедуру, а потом уже все строчки разом вписывает в "checkedListBox".

А нужно что бы прочитал строку, вписал в checkedListBox, провёл процедуру, убедился что результат положительный, поставил галку в checkedListBox,

только тогда начал читать следующую строку.


Ребят, большая просьба, не отправляйте меня учить C#, если кто знает, подскажите пожалуйста конкретным примером.

Спасибо за понимание.

#74 
Murr патриот06.12.17 15:18
Murr
NEW 06.12.17 15:18 
в ответ beautiful_man 06.12.17 12:31

происходит всё как нужно, но если убираю:

-----

Окошко мессагебоха отрисовывается поверх окошка програмки.

После его закрытия - перерисовываются затронутые им контролы.

Вопрос - когда же ты будешь перерисовывать свой чецклистбох?..


И это... как у тебя работает этот моментик

while (resultat != param.ToString());
{
checkedListBox1.SetItemChecked(checkedListBox1.Items.Count - 1, true);
}

пояснить не затруднит?

#75 
Murr патриот06.12.17 15:22
Murr
NEW 06.12.17 15:22 
в ответ Murr 06.12.17 15:18

П.С. Вариантов - два:

- слушать и делать что тебе говорят - в частности - расписать все в деталях как советует АлехНеk

- пинать махххл79, который знает что и как тебе лучше...

#76 
beautiful_man посетитель06.12.17 15:40
NEW 06.12.17 15:40 
в ответ Murr 06.12.17 15:18
Вопрос - когда же ты будешь перерисовывать свой чецклистбох?..

в чеклистбокс вписывается текст сразу:

var lines = System.IO.File.ReadAllLines("config.cfg");
foreach (var line in lines)
{
var matches = Regex.Matches(line, @"([\w+\s*\/\[\]]+,[\s*>?.?\d]+)");
foreach (Match match in matches)
{
var text = line.Split(',')[0];
checkedListBox1.Items.Add(text);

потом оправляется команда и проверяется выполнена ли она,

взял метод "do", что бы крутилось пока не выполниться:


var ar = match.Value.Split(',');
int param;
int.TryParse(ar[1].Trim(), out param);
do
{
Thread.Sleep(500);
SendXPCommands(ar[0], param);
Thread.Sleep(500);
Thread XPRead = new Thread(new ThreadStart(chekCommand));
XPRead.Start();
SendXPCommands(ar[0], 10, param);
Thread.Sleep(500);
SendXPCommands(ar[0], 0, param);
}

проверял методом "while", если команда выполнена, поставить галку в чеклистбоксе,

while (resultat != param.ToString());
{
checkedListBox1.SetItemChecked(checkedListBox1.Items.Count - 1, true);
}

но он почему то вначале выполняет команды, а потом уже пишет разом весь текст в чеклистбокс и ставит галки.


нужно:

1. Вписать в чеклистпокс текст

2. выполнить команду.

3. Проверить выполнена ли команда

3.1 Если не выполнена, повоторить пункт 2, 3

4. Если команда выполнена, поставить галку в чеклистбокс напротив вписанного текста.

5. Читать следующую строку в файле.


Если кому интересуют детали, могу через скайп показать.


#77 
Murr патриот06.12.17 17:58
Murr
NEW 06.12.17 17:58 
в ответ beautiful_man 06.12.17 15:40

Ты просишь не отправлять тебя учить С#.

Но без этих знаний ты не можешь написать код.


взял метод "do", что бы крутилось пока не выполниться

-----

Не взял метод, а использовал оператор. Как выглядит оператор и как он работает вполне нужно/можно смотреть в доках.


проверял методом "while", если команда выполнена, поставить галку в чеклистбоксе,

-----

Вхиле - тоже не метод, тоже оператор.

Если его рассматривать так как описно у тебя, то

while (resultat != param.ToString()) /* именно эта часть - до точки с запятой - должна выполнятся.*/ ;

Но твоя проблема в том, что данный вхиле - не тот вхиле который ты ожидаешь/описываешь. Это часть ДО - смотри в доках детали.

В программировании на языках типа Шарпа конструкция означает не то что ты для нее задумал, а то что определено синтаксисом языка... даже если вроде как должно быть по-другому - будет так как написано. По-другому - не будет.


но он почему то вначале выполняет команды, а потом уже пишет разом весь текст в чеклистбокс и ставит галки.

-----

Прими на веру - там делается именно то, что написано в программе.

Раздели на три части:

- Менеджер - читает фаил, отдает строки Парсеру, отдает блоки Команд Исполнителю и помещает нужное в ЧекедЛистБох.

- Парсер - каким угодно методом нарезает полученную строку на блок Команд.

- Исполнитель - выполняет Команды и сообщает результат.

Ну и, разумеется, Команды оформи как Команды.

Чем меньше кода тебе надо будет рассматривать за раз - тем быстрее ты поймешь где у тебя проблема.



1. Вписать в чеклистпокс текст

-----

Ну тут самая первая проблема в том, что непонятно какой текст вписывать в чеклистбох. Откуда его брать - не написано...


Честно говоря, Я до сих пор не до конца понимаю, что именно ты называешь командой.

Сначала это

было - < Текст >< Запятая >< Цифра >

потом < Текст >< Запятая >< Число >

потом < Текст >< Запятая >< Текст >< Запятая >< Цифра >

потом < Текст >< Запятая >< Текст >< Запятая >< Цифра >< Запятая >< Текст >< Запятая >< Цифра >...

[/пре]


Насколько Я могу судить - у тебя есть нечто, что базируется на строке текста имеет:

- текст который нужно поместить в ЧекедЛистБох,

- должно содержать одну и более Комманд,

- возможность выполнить команды

- сообщить результат...

Это может быть таким:

[pre]
class TCommandBlock

{

public TCommandBlock(string text)

{

if (TParser.Validate(text))

throw Exception("Wrong command text");

Text4ListBox = TParser.GetListBoxText(text);

Commands = TParser.GetCommands(text);

Status = TStatus.Unknown;

}

public string Text4ListBox { get; internal set; }

public List<TCommand> Command { get; internal set; }

public TStatus Status { get; internal set; }

public bool Execute()

{

bool result = true;

// here should be a code to execute block of the command

// it should change result to false if fail

if(result == true)

{

Status = TStatus.Ok;

}

else

{

Status = TStatus.Fail;

}

return result;

}

}




Разумеется, что это мало похоже на то что ты ожидаешь и тебе непонятно куда его пристраивать... но чтобы понять - надо учится.

Пока скажу что Менеджер должен получить строку из файла и создать ТКомманБлоцк на базе этой строки. Потом - управлять заполнением чецклистбоха, выполнением блока Комманд и проверкой статуса после выполнения.

#78 
beautiful_man посетитель06.12.17 18:56
NEW 06.12.17 18:56 
в ответ Murr 06.12.17 17:58

Спасибо за разъяснение,

отключил чеклистбокс,

команды читаются, отправляются, проверются, если надо, повторяются, если команда исполнена, читается следующая строка,

единственная проблема, в чеклистбокс вписываются все разом после проверки.

Почему, пока не понимаю.

Учиться никогда не поздно, но вот такой я ученик, учусь на конкретных примерах.

Даже просто прочитать строки из файла и вписать их построчно в чеклистбокс не получается,

вписывается все разом.

Может быть кто нибудь на конкретном примере, как построчно вписывать строчки из файла в чеклистбокс или листбокс?

#79 
Murr патриот06.12.17 19:23
Murr
NEW 06.12.17 19:23 
в ответ beautiful_man 06.12.17 18:56

Почему, пока не понимаю.

-----

Это довольно далеко от начал языка - это то, как форма/система отрисовывает контролы.

Когда ты заполняешь контролы данными они перерисовываются не сразу.

Так что либо ты ждешь когда система определит необходимость перерисовать контрол,

либо сообщаешь системе что она должна это делать и даешь возможность это сделать.

Читай Application.DoEvents

и Control.Invalidate & Co...

#80 
1 2 3 4 5 6 7 все