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

» Вопросы по Delphi 2

Автор: RomanTim
Дата сообщения: 19.10.2006 22:55
OrlangurStep
Что значит созданные? Если выделял память (New, GetMem или создавал объекты), то освободить ее надо обязательно, если просто присваивал им какие-то адреса, то в nil можно не сбрасывать
Автор: minos14
Дата сообщения: 19.10.2006 23:13
В компоненте Edit или MaskEdit нужно вводить целые числа справа налево. Каждый вновь введенный символ должен сдвигать предыдущий влево. При этом известно максимальное количество символов в поле, изначально там должны стоять нули - как шаблон в MaskEdit. Может кто подскажет как это реализовать.
Автор: RomanTim
Дата сообщения: 20.10.2006 06:47
minos14
Кидаешь на форму TEdit, устанавливаешь ReadOnly = True, в Text забиваешь нужное количество нулей, в обработчик OnKeyPress пишешь:
Код: if (Key in ['0'..'9']) and (Edit1.Text[1] = '0') then
Edit1.Text := Copy(Edit1.Text, 2, Length(Edit1.Text) - 1) + Key
else if Key = #8 then
Edit1.Text := '0' + Copy(Edit1.Text, 1, Length(Edit1.Text) - 1);
Edit1.SelStart := Length(Edit1.Text);
Автор: greenpc
Дата сообщения: 20.10.2006 07:04
RomanTim
в TMS можно сразу загрузить
(LoadCSV)
и разложить по столбцам файл
а потом одним циклом прогнать проверку
Автор: RomanTim
Дата сообщения: 20.10.2006 08:39
greenpc
А толку? Тот же самый цикл с добавлением итемов:
while not Eof(f)... lis := Self.Items.Add... lis.SubItems.Add...
какая разница кто его написал - тормоза в самом ListView, а не в способе чтения файла (ну если не читать посимвольно: текстовый файл на 8М читается через read 1350 мс, через readln 350 мс, через TStringList 40 мс)
Автор: vserd
Дата сообщения: 20.10.2006 09:08
Erazer

Цитата:
всегда и везде я менял %temp% на d:\temp а тут забыл голова садовая... как только поменял и перегрузил комп все так сразу и поставилось. Еще раз благодарю.
ЗЫ на буржуйских форумах тема подымалась не раз но нигде ни одного вразумительного ответа про TEMP никто не написал, не буду и я писать - в лом

Это стандартная ошибка инсталяторов InstallShield, да и другие грешили этим.
На счет не писать... Это зря. Вопрос то FAQ-овский :)
cryptonium
так какие вопросы по DUnit?
Автор: cryptonium
Дата сообщения: 20.10.2006 10:55
vserd
вопросов по нему самому в общем-то нет, поигравшись на тестовых примерчиках - протестировал его работу.
но вот в рабочий проект интегрировать не получается. Проблема в том что проект построен из пакетов (bpl) соответственно само исполняемое приложение только загружает стартовый пакет, помимо того связи между разными модулями приложения могут организовываться как привязкой, так и динамическими вызовами. И вот на текущий момент реализовать тестирование не удалось - хотелось пойти наимение трудоемкими путями - и пока везде я получаю access violation - найти какое-то упоминание о использовании dunit в такой ситуации не удалось. Если у кого-то есть подобный опыт или может подсказать идею - был бы премного благодарен - к тестам привык и тяжеловато уже без них - сам подумываю уже о том чтобы написать загрузчик под них.
да, dunit из bds 2006
Автор: minos14
Дата сообщения: 20.10.2006 19:47
RomanTim
Спасибо за ответ!
Только небольшая проблема - весь текст в Edit сдвинут к левому краю, а желательно,
чтобы к правому. Как это реализовать?
Автор: RomanTim
Дата сообщения: 20.10.2006 22:09
minos14
Можно взять какой-нибудь навороченный едит - например TAdvEdit от TMS
Если нужно просто сделать правое выравнивание, то можно так (сперто из того же TAdvEdit ) - создаешь наследника от TEdit, у него объявляешь
protected procedure CreateParams(var Params: TCreateParams); override;
и в ней пишешь
inherited;
Params.Style := Params.Style and not (ES_LEFT or ES_CENTER) or ES_RIGHT;
Потом или создаешь динамически экземпляры этого едита или можешь его завернуть в компонент и установить в среду
Автор: OrlangurStep
Дата сообщения: 21.10.2006 07:02
Larry
Про то и спрашиваю критично ли это. Ведь по идее все не глобальные переменные после выполнения процедуры уничтожаются.
Автор: SERGE_BLIZNUK
Дата сообщения: 21.10.2006 07:47
OrlangurStep

Цитата:
спрашиваю критично ли это. Ведь по идее все не глобальные переменные после выполнения процедуры уничтожаются.

вы только не путайте переменные и объекты. Под переменные выделяется место в стеке, после завершения процедуры стек очищается. А вот если вы создаете объект: myobject1 := TMyObject.Create или New() или выделяете память := GetMem... нужно чистить за собой ОБЯЗАТЕЛЬНО! - иначе и будут те самые утечки памяти...
Автор: FireZone
Дата сообщения: 21.10.2006 11:45
OrlangurStep
Каждому New должен соответствовать свой Dispose (хоть в той же процедуре, хоть в любой другой, главное, чтобы другая имела доступ к указателю на память, выделенную тем New). Аналогично, каждому GetMem должен соответствовать свой FreeMem, каждому Create свой Free. Другими словами, память, выделенная руками в некоторой процедуре, автоматически не освобождается при выходе из этой процедуры. А вот доступ к этой памяти можно и потерять, если указатели на выделяемую память были объявлены локально и никуда наружу не присваивались. Вот иллюстрация:
Код: var g_ptr: Pointer = nil;
procedure Test1;
var loc_ptr, loc_ptr1: Pointer;
begin
if g_ptr = nil then begin
GetMem(loc_ptr, 10);
g_ptr := loc_ptr;
end;
loc_ptr := nil; // совершенно лишняя операция в данном случае
GetMem(loc_ptr1, 10); //доступ к этой памяти мы потеряем и не сможем её освободить
end;

procedure Test2;
begin
if g_ptr <> nil then begin
FreeMem(g_ptr);
g_ptr := nil //если не очистим указатель, появится шанс нарваться на повторный FreeMem, что приведёт к ошибке
end
end;
Автор: OrlangurStep
Дата сообщения: 21.10.2006 15:04
FireZone, SERGE_BLIZNUK
Понял. И еще один вопрос как изменить содержимое ячейки в базе данных? ( Конкретно Access)
Автор: Jokerjar
Дата сообщения: 22.10.2006 15:48
Уже задавал вопрос о ListView, вроде решение нашли. Теперь такая проблема. Есть
[more=алгоритм, заполняющий ListView]var
Key1, Key2, Key3, Key4: string;
KeyDef1, KeyDef2, KeyDef3, KeyDef4: string;
TmpStr: string;
i: Integer;
SL1: TStringList;
begin
SL1 := TStringList.Create;
SL1.LoadFromFile('1.log');
KeyDef1 := ''; KeyDef2 := ''; KeyDef3 := ''; KeyDef4 := '';
for i := 0 to SL1.Count - 1 do begin
TmpStr := SL1.Strings[i];
Key1 := Copy(TmpStr, 1, Pos(Chr(182),TmpStr)-1);
Delete(TmpStr, 1, Pos(Chr(182),TmpStr));
if Key1='~' then Key1 := KeyDef1 else KeyDef1 := Key1;
Key2 := Copy(TmpStr, 1, Pos(Chr(182),TmpStr)-1);
Delete(TmpStr, 1, Pos(Chr(182),TmpStr));
if Key2='~' then Key2 := KeyDef2 else KeyDef2 := Key2;
Key3 := Copy(TmpStr, 1, Pos(Chr(182),TmpStr)-1);
Delete(TmpStr, 1, Pos(Chr(182),TmpStr));
if Key3='~' then Key3 := KeyDef3 else KeyDef3 := Key3;
Key4 := Copy(TmpStr, 1, Pos(Chr(182),TmpStr)-1);
Delete(TmpStr, 1, Pos(Chr(182),TmpStr));
if Key4='~' then Key4 := KeyDef4 else KeyDef4 := Key4;

LI:=Form1.ListView1.Items.Add;
LI.Caption:=Key1;
LI.SubItems.Add(Key2);
LI.SubItems.Add(Key3);
LI.SubItems.Add(Key4);
end; // for
FreeAndNil(SL1);

end;[/more]
Так вот, при большом файле он работает очень медленно. Есть какие-либо способы ускорения работы ListView, помимо BeginUpdate? Желательно именно к этому алгоритму.
Автор: afiget
Дата сообщения: 22.10.2006 19:46
Использовать AllocBy перед тем как добавлять большое кол-во элементов.
Автор: bornbill
Дата сообщения: 23.10.2006 10:36
Народ есть маленький вопросец.....
есть переменная spr:TStrings....
Так вот когда я пытаюсь начать сней работать....
spr.clear
spr.addstrings
Я получаю Access violation......
Может кто знает что надо добавить чтобы заработало
При компиляуии всё чисто варнингов и ошибок нет...
Заранее благодарен....
Автор: vshersh
Дата сообщения: 23.10.2006 10:39
bornbill
Напиши код, как ты его юзаешь...
Ато, как говорицца - телепаты в отпуске
Автор: OdesitVadim
Дата сообщения: 23.10.2006 10:42
Jokerjar
Есть такие алгоритмы. Добавляют - закачаешся.
Сам тестировал на днях - называется "виртуальный ListView". Добавление 5000 записей - доли секунды.
Почему тормозит добавление? Потому что при добавлении происходит много перераспределений памяти. Но неприятно другое, то что в памяти храниться двойная копия данных.
Как зделать "виртуальный ListView".
Первым долгом нужно "придумать" функцию, которая по номеру элемента в ListView могла выдать его содержимое. В самом просттом случае - это просто массив записей.
Теперь для ListView изменяем свойство OwnerData на true. Вторым действием будет установка ListView.items.Count равным фактическому количеству элементов (это делается на момент, когда ты данные загрузил и знаеш сколько их)
И последнее, написать обработчик OnData. Здесь передаётся параметр Item, который тебе через свойство index скажет свой номер, а через Caption SubItems.addd('') ты должен заполнить первый и другие столбцы. Этот обработчик будет "дёргаться" по мере того, как ListView будут нада данные для отображения. Сам опыт не ставил, но мне кажеться, что даром он его не дёргает. Надо элемент прорисовать - "дёрнул".
Согласно MSDN элементов в списке может быть на DWORD - а это 2 в 32 - десятизначное число - хватит с головой.

Добавлено:
bornbill
А о абстрактных класах тебе не расказывали? Используй TStringList и будет счастье
Автор: bornbill
Дата сообщения: 23.10.2006 10:46
В начале объявленно
Var spr:Tstrings;
Её естественно и передаю в качестве параметра....

[more=Читать дальше..]

Код: Procedure RunAny(CommandLine: string; Str: TStrings);
var
tRead, cWrite, dwAvail: cardinal;
SA: TSecurityAttributes;
PI: TProcessInformation;
SI: TStartupInfo;
sBuff: THandleStream;
StringBuf: TStringList;
begin
SA.nLength:=SizeOf(SECURITY_ATTRIBUTES);
SA.bInheritHandle:=True;
SA.lpSecurityDescriptor:=nil;
if not CreatePipe(tRead, cWrite, @SA, 0) then Exit;
ZeroMemory(@SI, SizeOf(TStartupInfo));
SI.cb:=SizeOf(TStartupInfo);
SI.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
SI.wShowWindow:=SW_HIDE;
SI.hStdOutput:=cWrite;
if CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI)
then begin
Str.Clear();//Вылетает здесь
sBuff := THandleStream.Create(tRead);
StringBuf := TStringList.Create();
repeat
StringBuf.Clear();
StringBuf.LoadFromStream(sBuff);
if StringBuf.Count > 0 then
begin
StringBuf.Strings[0] := Str.Strings[Str.Count-1]+StringBuf.Strings[0];
Str.Delete(Str.Count-1);
end;
Str.AddStrings(StringBuf);
WaitForSingleObject(PI.hProcess, 10);
PeekNamedPipe(tRead, nil, 0, nil, @dwAvail, nil);
until (dwAvail = 0);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end; // if CreateProcess
CloseHandle(tRead);
CloseHandle(cWrite);
end;
Автор: OdesitVadim
Дата сообщения: 23.10.2006 10:52
bornbill
А передаётся в процедуру валидный объект типа TStrins?
переделай строчку с ошибкой так

Код:
if (str=nil) or (not Assigned(str)) then ShowMessage('Караул!, объект не передан');
str.clear
Автор: bornbill
Дата сообщения: 23.10.2006 10:55
Ага есть такое дело....
Но что мне надо с ним сделать чтобы он стал валидным?
Create уже пробывал не помогает........
Заранее благодарен....
Автор: FRALX
Дата сообщения: 23.10.2006 10:58
OdesitVadim
А вот если str=nil
то IMHO str.clear приведет к ошибке доступа к памяти по адресу 0
Автор: bornbill
Дата сообщения: 23.10.2006 10:59
FRALX
Народ я это понимаю как сделать не нил?
Автор: FRALX
Дата сообщения: 23.10.2006 11:00
bornbill
str:=TStringList.Create()
Автор: bornbill
Дата сообщения: 23.10.2006 11:04
Raised exception class EStringListError with message 'List index out of bound (-1).Process Stop......
эх...
Автор: FRALX
Дата сообщения: 23.10.2006 11:06
Блин повторно послалось
Автор: OdesitVadim
Дата сообщения: 23.10.2006 11:08
FRALX
Не понял твоего замечания. Или ты намекаеш, что я Exit Упустил?
bornbill
Строка с созданием нового объекта должна быть в вызывающей процедуре.
А ошибочка в какой строке возникает?
Автор: bornbill
Дата сообщения: 23.10.2006 11:08
Происходит она в момент вызова процедуры Runany и соответственно передачи параметра...
Есть идеи?
Заранее благодарен..
Автор: FRALX
Дата сообщения: 23.10.2006 11:11
OdesitVadim
Ага
bornbill
И я это хотел спросить


Добавлено:
bornbill
А иде код этой процедуры смотреть ?
Автор: bornbill
Дата сообщения: 23.10.2006 11:15
На предидущей странице под [more]

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


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