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

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

Автор: greenpc
Дата сообщения: 09.08.2010 09:52
psa1974

Цитата:
могу порекомендовать список TStringList
+1
тогда для данных
Цитата:
Как бы теперь расчленить вот эту строку из масива
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1
на отдельные элементы
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C}
{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A}
1
var SLData : TStringList;
... SLData.text := StringReplace(SLData.text, ',', #13#10,[rfReplaceAll]);
ну и обработка

Код:
... for i:=0 to (SLData.count div 3)-1 do
payloadid := SLData.strings[i*3];
payloadidb := SLData.strings[i*3+1];
typeid := StrToIntDef(SLData.strings[i*3+2], 0);
Автор: Sergey_Demchuk
Дата сообщения: 09.08.2010 11:14
Поскольку в Дельфи 7 функции posex не оказалось, я вот сделал так

AssignFile(f, 'dependencies.txt');
Reset(f); // открыть для чтения
// чтение из файла
arr:=0; arrLength:=100; SetLength(myarr,100);
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
myarr[arr]:=buf;
if (arrLength-arr)<=1 then
begin
SetLength(myarr, arrLength+100);
arrLength:=arrLength+100;
end;
arr:=arr+1;
PP1:=Copy(buf,0,Pos(',',buf)-1);
PP2:=Copy(buf,SymPos(buf,1)+1,SymPos(buf,2)-SymPos(buf,1)-1);
PP3:=Copy(buf,SymPos(buf,2)+1,Length(buf)-SymPos(buf,2));
Dependencies(PP1,PP2,StrToInt(PP3));
// ShowMessage(PP2);
end;
CloseFile(f); // закрыть файл

где функция SymPos выглядит так (заменяет posex)

function SymPos(str : String; posit:Integer) : integer;
var
i : integer;
j : integer;
begin
result := 0;
j := 0;
for i := 0 to Length(str) do
if str[i] = ',' then begin
inc(j);
if j = posit then begin
result := i;
break;
end;
end;
end;

Правда выполнение сего кода с занесением в базу ( Dependencies(PP1,PP2,StrToInt(PP3)); ) заняло аж минуту или более даже, многовато...
Автор: Frodo_Torbins
Дата сообщения: 09.08.2010 11:39
Sergey_Demchuk
Попробуйте вычислять результаты функций SymPos(buf,2) и SymPos(buf,1) только один раз за итерацию.
Кроме того вы ведь сами управляете форматом своего файла. Можно сделать чтобы было по одному элементу в строке, тогда у вас будет три readln и ни одного Copy.
Автор: greenpc
Дата сообщения: 09.08.2010 12:06
Sergey_Demchuk
а зачем используется массив, если данные заносятся после парса из строчных переменных ?
Автор: ShIvADeSt
Дата сообщения: 10.08.2010 02:45
Frodo_Torbins

Цитата:
Кроме того вы ведь сами управляете форматом своего файла. Можно сделать чтобы было по одному элементу в строке, тогда у вас будет три readln и ни одного Copy.

Можно использовать типизированный файл и будет 1 Read для каждой записи Или (что мне более нравится так как один фиг юзается БД) - загнать все эти параметры из текстового файла в таблицу - тогда скорость работы увеличится. Один раз отпарсить той же Дельфи текстовый файл, чтобы загнать в таблицу и потом наслаждаться скоростью.
Автор: salexn1
Дата сообщения: 10.08.2010 12:04
1. PosEx "лежит" в StrUtils
2. Со строками нужно работать с 1 элемента, а не с 0
3. Много время убивается на расширение массива
4. Можно (если очень хочеться использовать массив, хотя ОН АБСОЛЮТНО тут не нужен) первой строкой записать количество элементов в массиве и сразу выставить размер.
Автор: greenpc
Дата сообщения: 10.08.2010 13:52
salexn1

Цитата:
первой строкой записать количество элементов в массиве и сразу выставить размер
Вы не правы. тогда уж

Код: type
TMyRec = record
S1, S2: string;
S3 : integer;
end;
const
MyRecs: array [0..<максзначение>] of TMyRec = (
(S1: 'первое значение в строке';
S2: 'второе значение';
S3: 5),
... и так далее
);

for i:= low(MyRecs) to high(MyRecs) do
Dependencies(ResRecs[i].S1, ResRecs[i].S2, ResRecs[i].S3);
Автор: salexn1
Дата сообщения: 10.08.2010 14:01
greenpc
Обоснуйте, почему не прав? Просто так сказать без аргументации - пустой звук.
Если использовать динамичесике массивы, то лучше выставлять или весь размер или выделять память большими порциями.
Потом, у вас пример, в котором в КОДЕ прописаны данные, а речь велась про то, чтобы иметь в файле все данные.
Автор: greenpc
Дата сообщения: 10.08.2010 14:15
salexn1

Цитата:
речь велась про то, чтобы иметь в файле все данные

посмотрите предыдущюю страницу- изначально данные были в программе

Цитата:
Если использовать динамичесике массивы, то лучше выставлять или весь размер

если я знаю весь размер то зачем мне динамика ? учтите в динамике нет контроля за выходом за границы массива

Цитата:
или выделять память большими порциями

сейчас это не актуально, а раньше часто можно было получить EOutOfMemory
Автор: Sergey_Demchuk
Дата сообщения: 10.08.2010 14:25
А вообще кто то работал с базами sqlite? Я нашел готовый примерчик и делаю его под себя. Нужная база в формате sqlite у меня есть. Я что делаю, открываю ее Sqlite Expert, выбираю нужную таблицу и експортирую ее в текстовый файл. Данные сохраняются в файле в виде
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1
Может конечно и быстрее будет напрямую переносить данные из существующей таблицы в новую, но я не знаю каким образом.
Автор: greenpc
Дата сообщения: 10.08.2010 14:35
Sergey_Demchuk

Цитата:
переносить данные из существующей таблицы в новую

если один в один думаю так -
Код: create table test_clon as select * from test
Автор: Sergey_Demchuk
Дата сообщения: 10.08.2010 15:41
Надо чтобы записи просто заменялм аналогичные если они есть либо перезаписывались. Но чтобы те что есть, оставались на месте. По твоему методу так работать будет?
Я делаю так.
...
sldb := TSQLiteDatabase.Create('cache.db');
try
if not sldb.TableExists('domain_data') then
sldb.ExecSQL('CREATE TABLE domain_data (domain TEXT, subDomain TEXT, key TEXT, value TEXT)');
...

А потом уже наполняю таблицу.
...
procedure InsertTab (Domain: string; SubDom: string; key:string; val:string);
begin
sltb := sldb.GetTable('select domain from domain_data where subdomain="' + SubDom + '"' + ' and key="' + key + '"');
if sltb.ColCount > 0 then
begin
sldb.ExecSQL('update domain_data set domain="' + Domain + '",subdomain="' + SubDom + '",key="' + key + '",value="' + val + '" where subdomain="' + SubDom + '" and key="' + key + '"');
end
else
begin
sldb.ExecSQL('insert into domain_data (domain,subdomain,key,value) values("'+ Domain +'","' + subdom + '","' + key + '","' + val + '")');
end;
sltb.Free;
end;
...
InsertTab('1','922988070434023647144890','SLRTIME','2010-05-15T15:52:45Z')

Добавлено:
Да и еще, переносить таблицы надо из одной БД в другую БД, которую сотворяем где-либо, а не в пределах одной БД
Автор: Granmer
Дата сообщения: 10.08.2010 16:57
Есть приложение главное окно - вверху окно, под ним табшит с вкладками. Все дочерние окна - mdichild, каждому окну создаётся вкладка и при создании оно разворачивается во всю главную форму. Но при этом в главное меню программы добавляются кнопки "свернуть, восстановить, закрыть". А мне их не надо, точнее они даже мешают, т.к. кнопка закрыть окно есть на табшите. Подскажите, пожалуйста, как убрать из главного меню эти дополнительные кнопки от mdi-окон? Если существенно, то использую компоненты Developer Express. Поиск в гугле дал только код для убирания заголовка mdi-окна, но кнопки при этом всё-равно остаются.
Автор: Sergey_Demchuk
Дата сообщения: 10.08.2010 17:04

Цитата:
StrUtils

Не смог подключить в свою Delphi7_Lite
Автор: Czechoslovak
Дата сообщения: 10.08.2010 17:40
Granmer
установи BorderIcons biSystemMenu := False
Автор: Frodo_Torbins
Дата сообщения: 10.08.2010 19:19
Granmer
Зачем вам при таком раскладе вообще сдались MDI-формы? Их вполне можно заменить обычными, или даже фреймами.
Автор: Granmer
Дата сообщения: 10.08.2010 22:32
Czechoslovak

Цитата:
установи BorderIcons biSystemMenu := False

Установил, кнопки исчезли, но вместе с ними и возможность развернуть child-окно на весь экран тоже. Теперь при создании окна оно разворачивается на всё родительское, но при переключении с одного окна на другое - восстанавливаются в размере, как в design-time. При попытке вручную максимизировать - игнорирует.
Frodo_Torbins
Про фреймы много начитал в инете, пугают большими утечками памяти и глючностью работы. Решил не брать. А обычные формы тут, как мне кажется не очень удобно было бы приспособить... Хотя, может, я не умею их готовить. Если подскажете как их можно привязать к табшиту, чтобы было красиво и правильно буду признателен.
Автор: greenpc
Дата сообщения: 11.08.2010 07:09
Sergey_Demchuk
никогда не работал с SQLite, но задите на сайт. почитайте доку и увидите великолепную команду, которая решает все ваши проблемы
_http://www.sqlite.org/lang_replace.html
открываете всю таблицу с данными которые хотите занести и в новую таблицу

Код: insert or replace into t (a, b, c) values ('a', 'b', 'c');
Автор: Frodo_Torbins
Дата сообщения: 11.08.2010 09:12
Granmer
Приблизительно так:
Код: Form2 := TForm2.Create(Self);
Form2.Parent := TabSheet1;
Form2.WindowState := wsMaximized;
Form2.BorderStyle := bsNone; //по желанию
Form2.Show;
Автор: Czechoslovak
Дата сообщения: 11.08.2010 09:13
Granmer
Ну так поставь форме свойство WindowsState := wsMaximized

Кстати в соседней ветке тот же Frodo_Torbins предлагал


Цитата:
Я вот когдато переделывал MDITab Michal Mutl-я: http://www.mikolatorbins.narod.ru/MDITab1.7.exe Компонент правда под AlphaControls заточен, но это легко исправить, достаточно в коде заменить TsCustomTabControl на TCustomTabControl и выкинуть ненужные юниты.

Автор: Granmer
Дата сообщения: 11.08.2010 09:38
Czechoslovak

Цитата:
Ну так поставь форме свойство WindowsState := wsMaximized

Ставлю, оно работает ровно один раз - при создании формы. Потом, когда открыты две и более вкладок, при переходе с одной на другую, размер формы "восстанавливается" и больше не разворачивается.
Автор: Granmer
Дата сообщения: 11.08.2010 13:56
Frodo_Torbins

Цитата:
Приблизительно так:
Код:
Form2 := TForm2.Create(Self);
Form2.Parent := TabSheet1;
Form2.WindowState := wsMaximized;
Form2.BorderStyle := bsNone; //по желанию
Form2.Show;
Хотя я не в курсе ваших критериев удобства.

Попробовал с парой окон, вроде - то что надо. Спасибо.
Заменил только Form2.WindowState := wsMaximized; на Form2.Align = alClient; иначе при ресайзинге табшита размер формы не изменялся.
Автор: Czechoslovak
Дата сообщения: 12.08.2010 08:15
Granmer
Не знаю, по моему фрэймами было проще пользоваться, тем болле что это наследник TForm и в общем то для этого вроде как и предназначен
Автор: Sergey_Demchuk
Дата сообщения: 15.08.2010 15:29
Можно ли обрабатывать параметры, переданные приложению? Например, запуск
program.exe -en
Автор: JohnSilver182
Дата сообщения: 15.08.2010 15:34

Цитата:
Можно ли обрабатывать параметры, переданные приложению? Например, запуск
program.exe -en


for i:=1 to ParamCount do paramstr(i) ;
Автор: Frodo_Torbins
Дата сообщения: 15.08.2010 18:51
Sergey_Demchuk
Еще в SysUtils есть интересная функция FindCmdLineSwitch.
Автор: Sergey_Demchuk
Дата сообщения: 15.08.2010 20:03
JohnSilver182
Frodo_Torbins
Спасиба, поробую.
А откуда лучше брать пути к системным папкам (Program Files, Application Data, C:\Program Files\Common Files...)?
Автор: andrewtishkin
Дата сообщения: 15.08.2010 20:12

Цитата:
пути к системным папкам

Через константы CSIDL, а начиная с Vista - можно и через KNOWNFOLDERID. Подробности и название функций для работы с ними см. в библиотеке MSDN

Из реестра не брать. Это дурной вариант
Автор: JohnSilver182
Дата сообщения: 15.08.2010 21:59

Цитата:
Через константы CSIDL

А МОЖНО ??????!!!!!!!!!
А то у меня вот для Мои Документы

Код: function GetMyDoc : string;
var
shellMalloc: IMalloc;
ppidl: PItemIdList;
PerDir: string;
P:array[0..255] of char;
begin

if Win32MajorVersion <= 4 then
begin
GetWindowsDirectory(p,max_path);
result:= Copy(strpas(p),1,3) + 'Мои Документы\';
end
else begin

ppidl := nil;
try
if SHGetMalloc(shellMalloc) = 0 then
begin
SHGetSpecialFolderLocation(0, CSIDL_PERSONAL, ppidl);
SetLength(Result, MAX_PATH);
if not SHGetPathFromIDList(ppidl, PChar(Result)) then
raise exception.create('SHGetPathFromIDList failed : invalid pidl');
SetLength(Result, lStrLen(PChar(Result)));
end;

finally
result:=result+'\';
if ppidl <> nil then
shellMalloc.free(ppidl);
end;

end;//if
end;//proc
Автор: ShIvADeSt
Дата сообщения: 16.08.2010 03:15
JohnSilver182

Цитата:
А МОЖНО ??????!!!!!!!!!


Цитата:
SHGetSpecialFolderLocation(0, CSIDL_PERSONAL, ppidl);

У тебя и есть через CSIDL - в частности CSIDL_PERSONAL

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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