Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 3

Автор: SERGE_BLIZNUK
Дата сообщения: 17.08.2007 07:53
kalkin удобно через TStringList это делать!

Код: [no]
var
i : Integer;
ts : TStringList;
s : string;
begin
try
ts := TStringList.Create;
ts.LoadFromFile('мой файлик.txt');
for i:=0 to ts.Count - 1 do
begin
s := Trim( ts.Strings )
if Length( s ) > 0 then
if copy(s,1,1)<>'#' then begin
<делаем то, что нужно делать с незакоменнтаренными строчками>
end;
end;
finally
FreeAndNil (ts )
end;
[/no]
Автор: 2Polkan
Дата сообщения: 17.08.2007 15:27

Цитата:
2Polkan
Я так понимаю, тебе нужен парсер (анализатор) строки. Есть такой класс TParser, им Delphi *.dfm файлы разбирает. Правда этот класс не документирован. Вот пара примеров:
Пример 1
Пример 2
Ещё можно здесь посмотреть.


спасибо, ето (почти) то что надо)

объясните нубу как еще в мемо построчно парсить каждую строку =)
Автор: RomanTim
Дата сообщения: 17.08.2007 15:32
2Polkan

Цитата:
объясните нубу как еще в мемо построчно парсить каждую строку

Код:
for i := 0 to Memo1.Lines.Count - 1 do
ParseString(Memo1.Lines[i]);
Автор: skinash
Дата сообщения: 19.08.2007 14:35
2Polkan
Если ты всё таки воспользуешься моим советом, то
Цитата:
в мемо построчно парсить каждую строку
не надо. Мемо легко переводится в Stream, а TParser работает с потоком. Советую изучить этот вопрос, очень полезная штука и много чего можно из неё выжать.
Ну а если всё таки сам будешь разбирать свою строку, то RomanTim правильно говорит, единствнное, тебе надо придумать эту процедуру ParseString.

Автор: Maks150988
Дата сообщения: 20.08.2007 00:06
Подскажите пожалуйста как центрировать диалог открытия файлов на WinAPI.
Автор: GreatOne
Дата сообщения: 20.08.2007 10:22
Народ, а как скопировать папку со всеми файлами и вложенными папками???
Автор: skinash
Дата сообщения: 20.08.2007 10:25
Maks150988
А как ты создаёшь окно диалога открытия файлов на WinAPI? Там наверняка должен быть параметр, отвечающий за центрирование.

Добавлено:
GreatOne
Смотри в виндовой справке ShFileOperation
Вот пример:

Код: procedure TForm1.Button2Click(Sender: TObject);
var
OpStruc: TSHFileOpStruct;
frombuf, tobuf: array [0..128] of Char;
begin
FillChar(frombuf, SizeOf(frombuf), 0);
FillChar(tobuf, SizeOf(tobuf), 0);
StrPCopy(frombuf, 'd:\brief\*.*');
StrPCopy(tobuf, 'd:\temp\brief');
with OpStruc do
begin
Wnd := Handle;
wFunc := FO_COPY;
pFrom := @frombuf;
pTo := @tobuf;
fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
ShFileOperation(OpStruc);
end;
Автор: GreatOne
Дата сообщения: 20.08.2007 10:45
skinash
Спасиба!
Автор: Maks150988
Дата сообщения: 20.08.2007 13:09
skinash, в том то и дело что я взял диск у друга с делфи, а сам не отметил галочку для установки справки win32. сама справка для делфи доступна только. к другу съездить не могу пока. приходится сюда обращаться. диалог создаю через функцию GetOpenFileNameA.
вообщем кстати задаю тогда еще один вопросец, интересующий меня. решил я значит грузить все строки для программы из ресурсов. но вот незадача для фильтра типов файлов в этом самом дилоге. я не знаю как правильно создать строку в редакторе ресурсов. в коде я делал так:


Код:
lpstrFilter := 'Все поддерживаемые файлы (*.*)'#0'*.1;*.2;*.3;*.4;*.5;*.6;*.7;*.8;*.9;*.10'#0+
'1 (*.1)'#0'*.1'#0 +
'2 (*.2)'#0'*.2'#0 +
'3 (*.3)'#0'*.3'#0 +
'4 (*.4)'#0'*.4'#0 +
'5 (*.5)'#0'*.5'#0 +
'6 (*.6)'#0'*.6'#0 +
'7 (*.7)'#0'*.7'#0 +
'8 (*.8)'#0'*.8'#0 +
'9 (*.9)'#0'*.9'#0 +
'10 (*.10)'#0'*.10'#0 +
'Все файлы (*.*)'#0'*.*'#0#0;
Автор: skinash
Дата сообщения: 20.08.2007 14:15
Maks150988
Короче, вот примерчик. Здесь OpenDialog не центрируется, а рисуется относительно верхнего левого угла вызывающей формы. Координаты указываются в rc-шаблоне.
Файл ресурсов myres.rc: [more]OFT DIALOG -1, 1, 304, 62
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
CONTROL "Select Options", 100, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 69, 4, 224, 52
CONTROL "CheckBox1", 101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12
CONTROL "CheckBox2", 102, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 38, 60, 12
}[/more]
Компилируется brcc32 myres.rc
Получается myres.res
Собственно код:
[more]
Код: unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CommDlg;

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
ofn: TOpenFileName;
f: array[0..MAX_PATH - 1] of Char;


implementation

{$R *.dfm}
{$R myres.res} // файл ресурсов с шаблоном

// hook-процедура
function Fh(Wnd: HWND; Msg: Cardinal; wParam, lParam: Integer): UINT stdcall;
begin
Result := 0;
case Msg of
WM_INITDIALOG:
begin
CheckDlgButton(Wnd, 101, BST_CHECKED);
// отметим первый чекбокс
end;
WM_COMMAND: // реакция на изменение состояния чекбоксов
case LOWORD(wParam) of
101:
begin
if (IsDlgButtonChecked(Wnd, 101) = BST_CHECKED) then
MessageBox(Wnd, 'CheckBox1 Checked!', 'FileOpenDialog', 0);
end;
102:
begin
if (IsDlgButtonChecked(Wnd, 102) = BST_CHECKED) then
MessageBox(Wnd, 'CheckBox2 Checked!', 'FileOpenDialog', 0);
end;
end;
WM_NOTIFY:
case
POFNotify(lParam)^.hdr.code of
CDN_FILEOK: // реакция на выбор файла
begin
if (IsDlgButtonChecked(Wnd, 101) = BST_CHECKED) then
MessageBox(Wnd, PChar('CheckBox1 Checked and ' + ofn.lpstrFile + ' selected'),
'FileOpenDialog', 0);
if (IsDlgButtonChecked(Wnd, 102) = BST_CHECKED) then
MessageBox(Wnd, PChar('CheckBox2 Checked and ' + ofn.lpstrFile + ' selected'),
'FileOpenDialog', 0);
end;
end;
end;

end;


procedure TForm2.Button1Click(Sender: TObject);
begin
FillChar(f, SizeOf(f), 0);
FillChar(ofn, SizeOf(ofn), 0);
ofn.lStructSize := SizeOf(TOpenFileName);
ofn.hwndOwner := Handle;
ofn.hInstance := hInstance;
ofn.lpstrFilter := 'Text Files (*.TXT)'#0'*.txt'#0 +
'Executables (*.EXE)'#0'*.exe'#0 +
'All files (*.*)'#0'*.*'#0#0;
ofn.lpstrTitle := 'Select File';
ofn.lpstrFile := f;
ofn.nMaxFile := MAX_PATH;
ofn.lpTemplateName := 'OFT'; // имя шаблона
ofn.lpfnHook := Fh; // hook-процедура
ofn.Flags := OFN_EXPLORER or OFN_CREATEPROMPT or
OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or
OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or
OFN_ENABLETEMPLATE;
// показываем диалог
if GetOpenFileName(ofn) then
ShowMessage(ofn.lpstrFile);
end;

end.
Автор: Maks150988
Дата сообщения: 20.08.2007 14:41
skinash
Да я это и так делал. А вот хочется именно центрировать дилог на экране. Впринципе подумывал из общей библиотеки стандартных диалогов редактором ресурсов выдрать диалог и вставить в свою программу, и стиль DS_CENTER к нему добавить и потом уже грузить как шаблон, но это все муторное дело, да и размер приложения хочу поменьше сделать.
С фильтром разобрался.

Создать ресурс:

Код: STRINGTABLE
LANGUAGE LANG_RUSSIAN, 0x1
{
1653,     "1653,     "Исполняемый файл (*.exe)|*.exe|Динамическая библиотека (*.dll)|*.dll||"
}
Автор: skinash
Дата сообщения: 21.08.2007 09:42
Maks150988
А посмотри как в VCL в модуле Dialogs сделали. Но там такОго наворочено, без стакана не разберёшься
Автор: Maks150988
Дата сообщения: 21.08.2007 10:47
Я видел примеры центрирования диалога. Там вычисляют разрешение экрана и делят какую-то пропорцию на 2. Врезультате диалог по центру. Но я не знаю как они там хэндл этого окна откуда берут. Примеры не полные. Обрубками все...
А в этих юнитах внатуре без бутылки не разберешься...
Автор: GreatOne
Дата сообщения: 21.08.2007 11:10
А есть альтернатива команды Sleep(); только чтобы прога не зависала на заданное время???
Автор: Arvur
Дата сообщения: 21.08.2007 11:21
GreatOne
Если не трогать winapi, думаю, цикл с Application.ProcessMessages может подойти
Автор: GreatOne
Дата сообщения: 21.08.2007 11:29

Цитата:

Если не трогать winapi, думаю, цикл с Application.ProcessMessages может подойти


То есть если я напишу так:

For i:=1 to 2000 do Application.ProcessMessages;

то прога сделает паузу на 2 секунды??? Или все зависит от скорости железа?

И еще вопрос - если в процедуре я вызываю ее саму, то она выполниться до конца или прерветься и начнет выполняться с новыми параметрами??
Автор: skinash
Дата сообщения: 21.08.2007 12:11
GreatOne
Нет, Application.ProcessMessages нужет чтобы программа не зависала от каких-нибудь длительных процедур:

Код: for I:=0 to Count do
begin
DoSomething(I);
Application.ProcessMessages;
end;
Автор: Arvur
Дата сообщения: 21.08.2007 12:11
GreatOne

Цитата:
все зависит от скорости железа

Именно так.
Простейший вариант:
- взять переменную Start: TDateTime
- записать в нее значение функции Now
- запустить цикл, сравнивающий разницу (Now - Start) с необходимым периодом
- в теле цикла -> ProcessMessages
Если нужна точность - используй функцию GetTickCount, остальной принцип тот же.


Цитата:
И еще вопрос - если в процедуре я вызываю ее саму, то она выполниться до конца или прерветься и начнет выполняться с новыми параметрами??

Эээ.. Переключится на второй вызов, а потом продолжится.
А лучше погугли по слову "рекурсия"

Добавлено:
GreatOne
Примерно так:

procedure Delay(DelayPeriod : Cardinal);
var
TimeStarted : Cardinal;
begin
TimeStarted := GetTickCount;
while ((GetTickCount - TimeStarted) < DelayPeriod) do
Application.ProcessMessages;
end;
Автор: SERGE_BLIZNUK
Дата сообщения: 21.08.2007 12:18

Цитата:
То есть если я напишу так:
for i:=1 to 2000 do Application.ProcessMessages;
то прога сделает паузу на 2 секунды??? Или все зависит от скорости железа?

да. Гарантированно менее 2 секунд.... (ну если только не win95 на pentium 133 ;-))

можно так:
Код:
var CountTicks : DWORD;
begin
CountTicks := GetTickCount();
repeat
Application.ProcessMessages()
until GetTickCount()>= (CountTicks+2000);
Автор: Arvur
Дата сообщения: 21.08.2007 12:35
SERGE_BLIZNUK
Хехе.. Я просто из старого кода куски повыдирал
ПКС=? (первый раз слышу)
Автор: Glukodel
Дата сообщения: 21.08.2007 12:38
Народ, ни у кого случайно не завалялись исходники к книге: Род Стивенс "Delphi:Готовые алгоритмы"? С благодарностью приму в дар

Добавлено:
GreatOne

Цитата:
А есть альтернатива команды Sleep(); только чтобы прога не зависала на заданное время???

То что ты хочеш, реализуется через потоки (TThread в делфях) - какая-то операция запускается отдельным потоком, а приложение (интерфейс в том числе) продолжают реагировать на действия пользователя. Шикарная статья про твой вопрос, многопоточность и про устройство винды: http://www.dtf.ru/articles/read.php?id=39888
Автор: GreatOne
Дата сообщения: 21.08.2007 12:54
2skinash


Цитата:
Нет, Application.ProcessMessages нужет чтобы программа не зависала от каких-нибудь длительных процедур:


То есть если я напишу:

Sleep(60000);
Application.ProcessMessages;

То прога не зависнет
Автор: Arvur
Дата сообщения: 21.08.2007 13:20
Glukodel

Цитата:
Шикарная статья про твой вопрос

Сам-то читал? В прикладных задачах вся эта красота с архитектурами процессоров и распараллеливанием алгоритмов - как рыбке зонтик
Автор: Glukodel
Дата сообщения: 21.08.2007 13:26
GreatOne

Цитата:
То есть если я напишу:

Sleep(60000);
Application.ProcessMessages;

То прога не зависнет

нет, тока потупит минуту

Добавлено:
Arvur

Цитата:
Сам-то читал?

не только читал, но и плотно работал с потоками...

Цитата:
В прикладных задачах вся эта красота с архитектурами процессоров и распараллеливанием алгоритмов - как рыбке зонтик

Эх, молодежжж это пока не попадется задача, где будут операции длительностью в минуты, часы, дни... (не поверишь, такие бывают ) ну и работа с сетью у всех нормальных людей на потоках (стандартный делфевый Indy весь на потоках).

Автор: GreatOne
Дата сообщения: 21.08.2007 13:39
Всем спасибо за советы!
Автор: Arvur
Дата сообщения: 21.08.2007 14:07
Glukodel

Цитата:
Эх, молодежжж это пока не попадется задача, где будут операции длительностью в минуты, часы, дни... (не поверишь, такие бывают ) ну и работа с сетью у всех нормальных людей на потоках (стандартный делфевый Indy весь на потоках).

Да я все больше утилитки на коленке пописываю
Может быть уважаемый гуру продемонстрирует, где в перечисленных задачах могут быть использованы рекомендации из данной статьи?

.. Абстрактную агитацию в пользу потоков не предлагать - я сам так умею

Добавлено:
Нет блин.. Сорри за офтоп, но спасибо огромнейшее за позитифф
Представил себе распаралелливание сетевых операций на разные процы с учетом их архитектуры.. И "ржунимагу" (с)
Автор: Glukodel
Дата сообщения: 21.08.2007 14:25
Arvur

Цитата:
где в перечисленных задачах могут быть использованы рекомендации из данной статьи?

Какие мы прямые Объясняю - судя по вопросу GreatOne ему нужно было что бы интерфес реагировал на пользователя во время какой-то операции... для этого есть Application.ProcessMessages, но для того, что бы точно понимать, как это работает, нужно знать механизмы работы винды... а в более сложных случаях кроме Application.ProcessMessages будут нужны потоки... как раз эти механизмы описаны в статье...
Автор: SERGE_BLIZNUK
Дата сообщения: 21.08.2007 14:28
Arvur
ппкс
Подпишусь Под Каждым Словом.
Автор: Arvur
Дата сообщения: 21.08.2007 14:34
Glukodel
В статье описаны особенности распределения процессорного времени между задачами в ОС Windows.
Подсовывать такое человеку в качестве вводной в потоки - это издевательство.

Тем более, что в 90% случаев ему это и не понадобится..
(Для пишущих игры да и просто интересующихся системами реального времени эта статья тоже не нужна - и так знают)

Имхо - внимательнее читай вопросы, человек в рекурсии путается, а тут ты с affinity mask

SERGE_BLIZNUK
О как... Пасибки, запомню
Автор: Glukodel
Дата сообщения: 21.08.2007 15:19
Arvur

Цитата:
Подсовывать такое человеку в качестве вводной в потоки - это издевательство

почти согласен НО в жизни не видел более корректного описания происходящего... из 10 известных мне делфи программеров только 3 (считая меня ) могут успешно использовать потоки, и то без этой статьи кое-что выпадало из поля зрения...

Цитата:
Имхо - внимательнее читай вопросы,

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

P.S. предлогаю завязать с флеймом...
P.P.S. начну с себя

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.