Member
Статус: Не в сети Регистрация: 24.12.2004 Откуда: Ставрополье
Максим и alpet Благодарствую.
_________________ Ставрополье Оверклокерс http://forums.overclockers.ru/viewtopic.php?t=125746 -= World Of Tanks =- (для связи Ватс Ап +7-903-418-03-43)
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
FatumNNM У alpet код прикольный, правда я чуть бы по другому написал. Надо будет найти - в свое время просто писал что-то типа TFileBufStream (кто помнит дос еще, тот поймет )
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 24.12.2004 Откуда: Ставрополье
Я разобрался c этим вопросом, переписал свой код заново и делаю поиск через массив.
Всем Спасибо
_________________ Ставрополье Оверклокерс http://forums.overclockers.ru/viewtopic.php?t=125746 -= World Of Tanks =- (для связи Ватс Ап +7-903-418-03-43)
Привет, помогите плиз со следующей задачей.
Надо написать прогу которая сканировала бы заданный каталог "A"
(если возможно путь к каталогу и его имя прописывать скажем в ini-файле),
копировала все его содержимое в другой каталог "B",
а потом по определенным двум-трем подряд идущим символам (они точно не будут повторяться в других файлах) в названии файла
разбирала файлы (с удалением из каталога "А") в указанные папки, если встречается архивный файл
(то есть к примеру если в каталоге "A" есть архив в имени которого подряд идут символы bfh), то
надо извлечь его содержимое в заданный каталог без сохраниния путей, то есть только файлы без папок или же
если в имени архива содержатся символы (ну к примеру rhk) то просто переместить его в указанный каталог.
Всем кто поможет заранее большое спасибо.
Procedure GetFiles2; Register; Var Temp: String; I64: Int64; Begin If ((FF[FF1].Name <> '.') And(FF[FF1].Name <> '..')) Then If ((FF[FF1].Attr And faDirectory) <> 0) Then GetFiles1(Dir1 + '\' + FF[FF1].Name) Else Begin Temp := Dir1 + '\' + FF[FF1].Name; If File1 = '*.*' Then Begin Files1.Append(Temp); Int64Rec(I64).Lo := FF[FF1].FindData.nFileSizeLow; Int64Rec(I64).Hi := FF[FF1].FindData.nFileSizeHigh; FileSize1.Append(IntToStr(I64)); End Else If File2 <> '' Then If UpperCase(ExtractFileExt(Temp)) = '.' + File2 Then Begin Files1.Append(Temp); Int64Rec(I64).Lo := FF[FF1].FindData.nFileSizeLow; Int64Rec(I64).Hi := FF[FF1].FindData.nFileSizeHigh; FileSize1.Append(IntToStr(I64)); End End; End;
Begin Inc(FF1); Dirs1.Append(Dir1); If FindFirst(Dir1 + '\*.*', faAnyFile, FF[FF1]) = 0 Then Begin GetFiles2; While FindNext(FF[FF1]) = 0 Do GetFiles2; FindClose(FF[FF1]); End; Dec(FF1); End;
Begin If File1 = '' Then File1 := '*.*'; If Not DirectoryExists(Dir1) Then Exit; For I := Length(Dir1) DownTo 1 Do If Dir1[I] <> '\' Then Break; SetLength(Dir1, I); If ClearList Then Begin Dirs.Clear; Files.Clear; FileSize.Clear; End; Files1 := TStringList.Create; Dirs1 := TStringList.Create; FileSize1 := TStringList.Create; If (File1[1] = '*') And (File1[2] = '.') Then File2 := UpperCase(Copy(File1, 3, Length(File1) - 2)); GetFiles1(Dir1); Files.AddStrings(Files1); Dirs.AddStrings(Dirs1); FileSize.AddStrings(FileSize1); Files1.Free; Dirs1.Free; FileSize1.Free; End;
На входе директория для поиска, маска для поиска файлов, а выходе получишь все встреченные директории, все файлы (с полным путем до них) и все размеры этих файлов. Количество файлов и количество размеров этих файлов одно и тоже, а количество директорий отличается. Переменная на входе ClearList говорит о том, нужно ли очищать все списки перед добавлением или нет.
Потом просто делаешь копирование всего списка files - все легко и делаешь анализ как ты хочешь.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
To all есть такой вопрос. Нужно сделать отчет (он уже сделан, но нужно доделать, но не совсем понимаю как), который бы выводил какую-то статистику по определенному человеку.
Сейчас отчет выводит общую статистику по всему указанному временному интервалу, а нужно добавить, чтобы еще, что в отчет добавилась статистика за каждый день.
Отчет в FastReport. Запрос на получение есть, переделать его что бы дополнительно что-то выводил могу без проблем, но переделать сам файл отчета с минимальными изменениями пока не помимаю как.
Помогите
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Есть консольное приложение(program project1), которое работает с модулем unit1.
Unit1 прописывается в uses этого приложения.
А что и где прописать в самом модуле, чтобы получить доступ к процедурам из этого приложения?
спасибо.
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Crowz процедуры должны быть public, а если хочеш и из этого модуля получить доступ к ф-ям приложения, то объяви в uses после implementation соответствующий модуль.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Crowz какая-то нестандартная задача, обычно наоборот в главном модуле (программе) вызываются функции из других вспомогательных. Так что запихни лучше свою функцию name1 в модуль unit1 и вызывай ее там сколько вздумается.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 02.03.2005 Откуда: Владивосток
Подскажите кто хорошо знает TThread. Проблема вот в чем - есть компонент для слежения за изменениями файловой системы(появление, изменение, удаление файлов и папок) - TDirMon. В исходниках. Работает так - запускает поток, и в нем уже вызывает апишные функции и обрабатывает их ответы, потом генерит евенты на которые я в проге делаю нужные действия. Причем я перепробывал уже несколько таких компонентов - и у них у всех есть такой трабл, связанный именно с потоком - ОН САМ ПО СЕБЕ ЗАКРЫВАЕТСЯ, т.е. происходит .OnTerminate потока, причем никто этого не делает, в смысле ни сам компонент, ни я из программы(я даже не могу добраться до самого потока, от объявлен в разделе private) ...))
Почему это может происходить - ???
P.S. - У меня на WINXP SP2 - такого нет, а на W2K - периодически, т.е. прога может пару суток пахать - все окей, а потом этот поток возьмет и закроется, но без ошибок и так что сам компонент не знает об этом, т.е. компонент продолжает типа работать ...))
Не стоит дублировать сообщение. Устное предупреждение. mein
Member
Статус: Не в сети Регистрация: 13.06.2005 Откуда: Украина, Глухов
Aleksoid1978 писал(а):
я даже не могу добраться до самого потока, от объявлен в разделе private
Aleksoid1978 писал(а):
TDirMon. В исходниках
поправь, если надо.
а так - вероятно что-то с данными на диске, если все компоненты так работают - ну там файло какое-то появляется, что они дуреют и либо валятся, либо условие выхода срабатывает. може, доступа к файлам?
_________________ Что-то начнется, что-то закончится...
Member
Статус: Не в сети Регистрация: 02.03.2005 Откуда: Владивосток
wCat писал(а):
Aleksoid1978 писал(а):
я даже не могу добраться до самого потока, от объявлен в разделе private
Aleksoid1978 писал(а):
TDirMon. В исходниках
поправь, если надо. а так - вероятно что-то с данными на диске, если все компоненты так работают - ну там файло какое-то появляется, что они дуреют и либо валятся, либо условие выхода срабатывает. може, доступа к файлам?
По поводу первых двух фраз - я не совсем правильно выразился - я имел ввиду что поток в этом копмоненте объявлен в разделе private - вот почему его невидно из программы(нельзя программно получить доступ).
А с файлами все нормально - т.к. я уже запарился эксперименты ставить и одни и теже файлы копирую туда-сюда - вроде все окей, а через пару-тройку дней бац и все.
Условия выхода тоже не срабатывают - я на все условия и ошибки сделал запись в лог-файл. Причем при срабатывании .OnTerminate я вызываю GetLastError - так она возвражает 0 - А это значит что ошибки нет ...))
Member
Статус: Не в сети Регистрация: 02.03.2005 Откуда: Владивосток
svin писал(а):
Парни, помогите написать такую вот вещь: В StringGrid1 вводяться имена, при нажатии кнопки они сортируються по алфавиту и выводяться в StringGrid2.
Можно так - создаеш TStringList, у него выставляеш свойство Sorted в True, копируеш в него все свои значения(вводимые имена) из StringGrid1 а потом из TStringList уже копируеш в StringGrid2. Тока что проверил - сортировка по алфавиту идет ...))
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
svin
Код:
var Lst: TStringList; // Сам лист, промежуточный контейнер для сортировки str: string; i: cardinal; begin Lst := TStringList.Create; // Инициализация листа Lst.Sorted := true; randomize; // Инициализация генератора случайных чисел for i:=1 to 49 do begin // Типа перемудреная генерация строчек для сортировки str:=CHR(ORD('A')+random(ORD('Z')-ORD('A')))+ CHR(ORD('A')+random(ORD('Z')-ORD('A'))); Lst.Add(str); // Добавляем строку в лист StringGrid1.Cells[1,i] := str; // Выводим ее в первый StringGrid end;
// Выводим отсортированные строчки for i:=1 to 49 do StringGrid2.Cells[1,i] := Lst.Strings[i-1]; end;
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Ооо… А интересно как вы планируете сортировать данные в TStringGrid при наличии более чем одной колонки?
Пример: 3 три колонки, первая - дата, вторая - имя, третья - рейтинг -> 12.10.2005;Пупкин;97
И соответственно корректная сортировка записей по любому из полей (столбцов).
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
_SGK можно заюзать чтонибудь такое например
Код:
{ 0 - одинаковые строки 1 - s1 выше при сорт. по возрастанию 2 - s1 ниже s2 } function StringsCompare(s1, s2 : string) : byte; var i, N : cardinal; begin Result := 0; if Length(s1) <= Length(s2) then N := Length(s1) else N := Length(s2);
for i:=1 to N do begin if UpCase(s1[i]) < UpCase(s2[i]) then begin Result := 1; break; end; if UpCase(s1[i]) > UpCase(s2[i]) then begin Result := 2; break; end; end;
if (Length(s1) <> Length(s2)) and (Result = 0) then if Length(s1) > Length(s2) then Result := 2 else Result := 1; end;
и далее примерно так
Код:
repeat nm := false; for i:=1 to 49 do if StringsCompare(items[i].str,items[i+1].str) = 2 then begin tmpitm := items[i]; items[i] := items[i+1]; items[i+1] := tmpitm; nm := true; end;
until nm = false;
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Последний раз редактировалось Lord_of_Darkness 21.02.2007 22:05, всего редактировалось 1 раз.
Пример: 3 колонки, первая - дата, вторая - имя, третья - рейтинг -> 12.10.2005;Пупкин;97
2.
_SGK писал(а):
И соответственно корректная сортировка записей по любому из полей (столбцов).
Несмотря на то, что данные хранятся в строке, для корректной сортировки их нужно обрабатывать как разные типы: дату как TDate, имя как String, рейтинг как Integer (к примеру). Чтобы было понятно, о чем речь просто отсортируй числа от 1 до 20 как строки и посмотри на результат -> 1;10;11;12;13;14;15;16;17;18;19;2;20;3;4;5;6;7;8;9. Согласись, что это совсем не то, что ожидалось. А именно так и будет отсортированы значения поля рейтинг, если их сортировать как строки. Такая же байда будет и с данными представленными такими типами как: TDateTime, Currency и т.п. Соответственно для колонки перед сортировкой необходимо определить тип данных которому строчка из этой колонки соответствует, каждое значение приводить к нужному типу + не забыть о других полях в плане их синхронного перемещения вместе с полем по которому выполняется сортировка. Все это ессно реализовывается, но из-за проверок и преобразований работает медленно. Плюс раз уж работа с данными, то хотелось бы иметь и поиск и фильтрацию. А усе это нужно мутить самому. Это я к тому, что целесообразность использования TStringGrid для меня всегда была неясна. Если данных немного и требования к их обработке никакие, то как не крути, а TListView выглядит в разы приятней, а если нужно серьезней поработать с данными то тут выбор - БД, для небольших объемов подходит TClientDataSet.
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
_SGK я сказал "чтонибудь такое например" или ты ждал, что я тут модуль накатаю на пару тысяч строк с быстрой сортировкой всевозможных наборов данных и с кучей перегружаемых функций??
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения