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

» Вопросы по Delphi

Автор: evle
Дата сообщения: 29.05.2005 16:59
Larry Laffer
Можно поколдовать с функцией IntToHex (Считать файл, сказать что это массив чисел и прогнать по нему эту функцию, результат в другой массив). Может есть и готовое что, не встречался.
Автор: Larry Laffer
Дата сообщения: 29.05.2005 17:48
evle, да я часа три так с бубном танцевал. Не выходит нифига.
Автор: KDA
Дата сообщения: 29.05.2005 18:28
Larry Laffer
Оптимизировать сам будешь

function FileToHex(const aInputFileName, aOutputFileName : String) : Boolean;
const
HexChars : array [0..15] of Char = '0123456789ABCDEF';
var
B : Byte;
Input, Output : TFileStream;
begin
Result := False;
Input := nil;
Output := nil;
try
Input := TFileStream.Create(aInputFileName, fmOpenRead);
Output := TFileStream.Create(aOutputFileName, fmCreate);
while Input.Position < Input.Size do begin
Input.Read(B, 1);
Output.Write(HexChars[B shr 4], 1);
Output.Write(HexChars[B and $f], 1);
end;
Result := True;
finally
Input.Free;
Output.Free;
end;
end;
Автор: Larry Laffer
Дата сообщения: 29.05.2005 18:58
KDA, спасибо, оптимизирую.
Автор: ViktorSila
Дата сообщения: 30.05.2005 16:23
К проге подключены два модуля.
1. Потомок от DataSet(MyDataSet)
2. Во втором модуле (MyData) данные с которыми работает это MyDataSet, и пару обработчиков собитий к MyDataSet-у.
В потомке они представлены:

Цитата:

FPerformClearFields: procedure(Index: integer) of object;
FPerformCreateFloatingRecord: function(SourceIndex: integer): integer of object;
FPerformFreeFloatingRecord: procedure(Index: integer) of object;
....

А их обработчики в MyData(2-ой модуль):

Цитата:
procedure TMyData.ClearFields(Index: integer);
begin
TMyRecord(List[0]).Name := '(name)';
TMyRecord(List[0]).EMail := '(email)';
end;
....


Как подключить к MyDataSet (или к его экземпляру) обработчи событий, определенных в модуле MyData????
Автор: YurikGL
Дата сообщения: 30.05.2005 18:31

Цитата:
Как подключить к MyDataSet (или к его экземпляру) обработчи событий, определенных в модуле MyData????


Попробуй присваивать события

procedure TForm1.my(Sender: TObject);
begin
Edit2.Text:=Edit1.Text;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.OnChange:=my;
end;

В данном примере я при Edit1.OnChange выполняется процедура my;
Автор: ViktorSila
Дата сообщения: 30.05.2005 20:18
Если

Цитата:
MyDataSet: TMyDataSet;
MyDData: TMyData;
....

то

Цитата:
MyDataSet.FPerformGetRecordCount := MyDData.GetRecordCount;

работает, но это процедура. А как быть с функциями???
Да и вообще, что это за переменные

Цитата:
FPerformSetFieldData: procedure(Index: integer; Field: TField; var Data)
of object;
FPerformGetCanModify: function: boolean of object;

Автор: YurikGL
Дата сообщения: 31.05.2005 06:43

Цитата:
но это процедура. А как быть с функциями???


В чем принципиальная разница?
Автор: vserd
Дата сообщения: 31.05.2005 09:59
ViktorSila

Цитата:
работает, но это процедура. А как быть с функциями???
Да и вообще, что это за переменные

RTFM Delphi Help (Procedural types). Очень занимательно.
Автор: ViktorSila
Дата сообщения: 31.05.2005 18:42
vserd
Спасибо, разобрался!!!!
Автор: Skipper
Дата сообщения: 01.06.2005 17:08
Имеется TreeView вида:

Delphi
|
|-----5.txt
|
|-----6.txt
|
|-----7.txt
|
|--Help
| |
| |-----Test1
| |
| |------test.txt
|
|--Конец

Подскажите, пожалуйста, как создать такое же дерево файлов и папок, но только уже на HDD. Желательно пример работы.
Автор: Larry Laffer
Дата сообщения: 01.06.2005 17:14
Skipper, то есть брать дерево из программы и на его основе создавать папки и каталоге на жестком диске, так что ли? Используй команду ForceDirectories.
Автор: YurikGL
Дата сообщения: 01.06.2005 19:46
Можно рекурсивно оббежать дерево и насоздовать папок.
Автор: OdesitVadim
Дата сообщения: 01.06.2005 19:59
Skipper
тут самое лучшее - рекурсивная обработка. ПРимер кода (правда возможно доработка понадобиться) Рабочий

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
CreatePapki(TreeView1.Items[0],'C:\tem');
end;

procedure TForm1.CreatePapki(r: TTreeNode;d:string);
begin
if r=nil then exit;
while r<>nil do
begin
if ForceDirectories(d+'\'+r.Text) then memo1.Lines.Add(d);
CreatePapki(r.getFirstChild,d+'\'+r.Text);
r:=r.getNextSibling;
end;
end;
Автор: vinnik_pux
Дата сообщения: 01.06.2005 22:43
как заставить дельфи 7 вводить на сайтах автоматически логин пароль (например на мыло)? если использовать самописный браузер на дельфях

Добавлено:
тоесть хочу сделать автоматическое заполнение web форм
Автор: bask1982
Дата сообщения: 02.06.2005 10:37
Delphi + Outlook2003:
Как получить доступ к полю "Body" у Appointment'а без вызова защиты Outlook'а(окошка с выбором времени на длительность доступа)?
Автор: CreoVision
Дата сообщения: 02.06.2005 10:55
Вот, у меня есть несколько вопросов.
1.Обьясните пожалуйста, зачем нужны потоки, что это такое?
2.Обясните что такое указатели и зачем они нужни,


Спасибо... Только не сильно заумно, а человеческим языком.
Автор: Larry Laffer
Дата сообщения: 02.06.2005 11:11
CreoVision,
1. Поток - это отдельный процесс, выполняющийся параллельно основной работе программы. Пройстеший пример потока - проверка орфографии в Microsoft Word. Этот модуль отведен в отдельный поток. Если бы проверка орфографии выполнялась в основном потоке, то программа жутко бы тормозила при наборе текста (т.к. во время проверки происходит достаточно нелегкий процесс поиска соответствий по словарю).

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

2. Указатели: не знаю даже, как дать определение. Попробую объяснить. При использовании какой-нибудь процедуры, использующей какие-либо входные параметры (число, строка), перед непосредственным её выполнением программа подгружает входные параметры (переменные) в область памяти, а только потом извлекает их оттуда для работы. Указатель может передать твоей процедуре адрес на область памяти, где находится твоя переменная. То есть, используя указатель, тебе не придется передавать целую строку процедуре, а только указать область памяти, где эта строка находится.

Вот. Вроде так.
Автор: CreoVision
Дата сообщения: 02.06.2005 11:18
Larry Laffer
т.е. Поток-это отдельная подпрограмма...
Чего можно добиться используя потоки...
Зачем чтение из потока, запись в поток???



Добавлено:
Larry Laffer

Указатели

А почему вместо указателя нельза переменную использивать...

Недоходит...


Добавлено:
А как например, загрузить процедуру, модуль в потоки, примерчик можна?
Автор: Larry Laffer
Дата сообщения: 02.06.2005 11:29
CreoVision, про чтение и запись: это то же самое, если твоя главная форма у программы будет обмениваться данными с дочерней. Например, ты хочешь в своей программе по-тихому просканировать реестр и что-то там найти. Если ты будешь делать модуль сканирования реестра в главном юните, то при выполнении программа как бы зависнет (если не вставлять процедуру Application.ProcessMessages). Если же ты вынесешь модуль сканирования реестра в отдельный поток, то это практически никак не отразится на работе самой твоей программы (т.е. главной формы). В то же время твоя программа может обмениваться данными с потоком (если ты нашел что-нибудь необходимое в реестре, что тебе нужно утянуть). И передавать данные в поток, например, для задания опций сканирования.

Добавлено:
CreoVision, с указателями я не работал, пытался объяснить из теоретических знаний. Думаю, что местные гуру объяснят лучше. Вот с потоками мне работать приходилось.
Автор: CreoVision
Дата сообщения: 02.06.2005 11:34
Как осуществить доступ , например, к процедуре, изменить значение переменнной в потоке???
Автор: Larry Laffer
Дата сообщения: 02.06.2005 11:45
Пример использования потока:


Цитата:
unit Unit5;

interface

uses
Classes, Windows, winsvc;

type
SecondTheard = class(TThread)
private // В эту секцию ты можешь добавлять свои процедуры, которые хочешь использовать в потоке. У меня добавлена процедура sstatus;
procedure sstatus;
protected
procedure Execute; override; //Это процедура, которая выполняется при запуске потока;
end;

implementation

Uses Unit1;

procedure SecondTheard.Execute;
var
hEvent:Thandle;
begin
hEvent:= CreateEvent(nil, true, false, 'getservice');
while not terminated do begin
WaitForSingleObject(hEvent, 5000);
synchronize(sstatus);
end;
end;

procedure SecondTheard.sstatus;
begin
if SERVICE_RUNNING = MainForm.ServiceGetStatus(nil, 'df')=false then MainForm.Indicate(true)
else MainForm.Indicate(false);
end;

end.


Это Unit самого потока. В главном юните нужно добавить:


Цитата:
...

implementation
uses Unit5 // Добавил сюда Unit моего потока. В данном случае Unit5;

...

procedure TMainForm.FormCreate(Sender: TObject);
var
...
st: SecondTheard;
begin
...
st:=SecondTheard.create(false); // Создаем поток. В скобках указано, что поток сразу начинает выполнения. В противном случае нужно поставить true, а для последующего запуска потока использовать метод Resume;
st.Priority:=tpLowest; // Задаем приоритет. Может принимать значения: tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical;
st.freeonterminate:=true; // Если значение true, то после выполнения процедуры Execute поток самоуничтожится;
end;


Чтобы изменить значение переменной в потоке, добавь переменную потока в раздел public, после чего ты сможешь изменить её из любого юнита твоей программы, к которому подключен юнит потока.
Автор: CreoVision
Дата сообщения: 02.06.2005 11:53
Larry Laffer


Цитата:

procedure SecondTheard.Execute;
var
hEvent:Thandle;
begin
hEvent:= CreateEvent(nil, true, false, 'getservice');
while not terminated do begin
WaitForSingleObject(hEvent, 5000);
synchronize(sstatus);
end;
end;

procedure SecondTheard.sstatus;
begin
if SERVICE_RUNNING = MainForm.ServiceGetStatus(nil, 'df')=false then MainForm.Indicate(true)
else MainForm.Indicate(false);
end;

end.


Прокомментируй плз... А то не понятно все полностью...
Сенкс.

Автор: Larry Laffer
Дата сообщения: 02.06.2005 12:01
CreoVision, то, что заключено между begin и end процедур - это не имеет значения. Просто я скопировал пример моей программы.


Цитата:
procedure SecondTheard.Execute;
begin
... // Сюда пишешь код, который будет выполняться при запуске потока;
synchronize(sstatus); // Выполняется процедура sstatus, объявленная в секции private; Это для примера добавления новых процедур в поток. Если новых процедур, то и данной строки в коде быть не должно.
end;

procedure SecondTheard.sstatus;
begin
... // Сюда пишешь все, что угодно;
end;


Неизменчивой здесь остается процедура Execute, которая выполняется при запуске потока.
Автор: CreoVision
Дата сообщения: 02.06.2005 12:09
сенкс, помог очень, спасибо, тепер ссылка розобраться надо было бы...
Автор: Larry Laffer
Дата сообщения: 02.06.2005 12:15
CreoVision, могу скинуть документацию с примерами по программированию потоков. Если желаешь, оставляй мыло в PM.
Автор: vserd
Дата сообщения: 03.06.2005 12:07
CreoVision

Цитата:
1.Обьясните пожалуйста, зачем нужны потоки, что это такое?

Поток, это код который выполняется на процессоре. Программа может быть как однопоточная, так и много поточная. Каждая программа имеет как минимум один поток.
Потоки нужны для увеличения скорости работы программы путем распаралеливания. (т.е. если у тебя несколько процессоров, и многопоточная программа, ОС может расспланировать их работу одновременно на нескольких процессорах (один поток-один процессор)). Потоки нужны для сокращения накладных расходов при планировании задач ОС.



Цитата:
Чего можно добиться используя потоки...

Уменьшение "тормознутости" своей программы при выполненни некоторых операций. В качестве примера обычно приводят проверку орфографии, постановку в очередь на печать.

Цитата:
Зачем чтение из потока, запись в поток???

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


Цитата:
2.Обясните что такое указатели и зачем они нужни,

Скажем так, у тебя есть массив кил так на 20 (или другие данные). Тебе нужно их передавать в процедуры/функции. Если у тебя нет указателей, тогда ты вынужден копировать массив каждый раз, а если есть, ты передаешь указатель на него (обычно 4 байта). Вот и прикинь разницу во времени выполнения.
Автор: CreoVision
Дата сообщения: 03.06.2005 12:33
vserd

Цитата:
Цитата:2.Обясните что такое указатели и зачем они нужни,

Скажем так, у тебя есть массив кил так на 20 (или другие данные). Тебе нужно их передавать в процедуры/функции. Если у тебя нет указателей, тогда ты вынужден копировать массив каждый раз, а если есть, ты передаешь указатель на него (обычно 4 байта). Вот и прикинь разницу во времени выполнения.


Т.Е. при передаче параметров массив копируется???

Автор: EZH
Дата сообщения: 03.06.2005 13:10
CreoVision
Кстати, на заметку, потоками в программировании называют ещё одно понятие - нечто, куда направляются данные (или извлекаются). Тоже говорят - писать в поток и читать из потока.
Наверняка ты слышал про перенаправление вывода данных вместо экрана, например, на принтер или в файл. Можно в блок памяти.
В Delphi тоже очень активно используются, например для сохранения свойств компонентов (обычно это процедуры SaveToStream/LoadFromStream).

Чтобы не путать эти понятия, часто наследников TThread стараются называть по русски "нитями", а наследников TStream - потоками.
Автор: evle
Дата сообщения: 03.06.2005 13:18

CreoVision

Цитата:
Зачем чтение из потока, запись в поток???

У меня такое ощущение, что тут опять смешали два понятия:

Цитата:
thread 1) поток; нить ( создаваемый многозадачной операционной системой объект (один или несколько) внутри процесса, который выполняет инструкции программы; потоки позволяют осуществлять параллельное выполнение процессов и одновременное выполнение одним процессом различных частей программы на различных процессорах )

и

Цитата:
stream 1) поток - bit stream - bitstream - data stream - input stream - output stream - serial stream 2) поток ( в технологиях на основе COM - аналог файла в структурированном хранилище ( structured storage ) )

Когда говорят о чтении из потока, обычно имеют в виду именно stream. Вообще, в последнне время, к счастью, стали отходить от термина "поток" применительно к первому случаю как раз из-за этой путаницы.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


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