Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

George_Lucky



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем добрый день!
 
Кто сталкивался с функцией FindFirst - поиска файла по шаблону?
Описываю ситуацию, в простой vcl-форме, она работает прекрасно.
 
Но у себя я использую Service, в определенный момент времени служба запускает функцию FindFirst для определения наличия необходимых файлов по заданному шаблону (E:\Data\imp*.zip) и не находит, хотя на самом деле файлы существуют. В чем причина? У Service ограниченная видимость или ограниченный доступ к каталогам?
Подскажите, если есть какие-то идеи. Спасибо

Всего записей: 413 | Зарегистр. 12-09-2002 | Отправлено: 07:54 04-04-2006
whitewolfs

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt а что даст RecordCount?
короче объясню все подробно. есть код:
 
       Table1.Filter:='''NPD='+'TS[TID]''';
       Table1.Filtered:=true;
         
while not Table1.eof do begin //============================
         TEMPString3:=Table1.FieldByName('NPD').AsString;
         if TEMPString3=TS[TID]  
           then begin //`````````````````````````````````````````````````````````
            Table2.Insert;
            for Num := 0 to Table1.FieldCount-1 do
               begin
                Table2.Edit;
                Table2.Fields[Num].Assign(Table1.Fields[Num]);
               end;
           Table2.Post;
 
                   end; //````````````````````````````````````````````````````````
             Table1.Next;
                                   end; //============================
 
Смысл всего этого скопировать из Table1 все строки с нужным значением (переменная TS[TID])  в Table2.  При этом используется компонент TDBF (http://sourceforge.net/projects/tdbf/)  для доступа к базам без BDE.  Базы - dbase III. Все работает, но медленно.  Причем как выяснилось медленно работает из-за того, что фильтрация почемуто как бы не принимается во внимание. Тоесть начиная с while not...  база читается всеравно с первой до последней строки, ЦЕЛИКОМ! Вопрос: ПОЧЕМУ??? Как сделать, чтоб читались только отфильтрованные строки, а не просматривалась вся база заново?

Всего записей: 300 | Зарегистр. 21-10-2005 | Отправлено: 08:27 04-04-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
whitewolfs
я делаю по другому,

Цитата:
 
       Table1.Filter:='''NPD='+'TS[TID]'''; //что здесь за бред? если тебе нужно выбрать только записи у которых NPD=TS[TID], где TS[TID] это какое то значение, то не так это делается Table1.Filter:='NPD='''+IntToStr(TS[TID])+''''; //так как не знаю какого у тебя типа твое ТС(ТИД) то сделал перевод из целого в строку, ибо все равно некоторые моменты твоей записи не понятны.
       Table1.Filtered:=true;

далее
      Table1.First;
      for i:=1 to Table1.RecordCount do begin
 ... здесь делаем что нам надо
      Table1.Next;
     end; // конец цикла, у меня всегда все это правильно срабатывало, есть вариант, что у тебя просто фильтрация криво написана, так как из твоей записии вообще не должно было не одной записи отразиться либо EOF сбрасывает фильтр.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:50 04-04-2006
ArtemiyUO

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
George_Lucky
код покажи

Всего записей: 539 | Зарегистр. 12-12-2005 | Отправлено: 09:03 04-04-2006
0bject

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Кто сталкивался с функцией FindFirst - поиска файла по шаблону?

 
const
  FileAttrs : integer = faDirectory;// faHidden  faSysFile faVolumeID  faDirectory faDirectory  faArchive  faAnyFile
  startd:string = 'd:\';
  bagchar:string = '\/:*?<>| ';
 
procedure TForm1.getdirk(startdir:string);
var
  sr: TSearchRec;
begin
 if FindFirst(startdir+'*', FileAttrs, sr) = 0 then
    begin
      repeat
        if (sr.Attr and FileAttrs) = sr.Attr then // если это директория
        begin
       .....
       .....
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
end;
 
 
-----
ну вот у меня было что-то на подобе этого,,, -все работало

Всего записей: 10 | Зарегистр. 02-02-2006 | Отправлено: 09:13 04-04-2006
Schatz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
День добрый.
Передаю данные через Indy(TCP) компаненты.
Передаю из WIN приложения в Dll
 
Вот структура передаваемых данных
 
  TDate=Record
    NumberString:Byte;
    Text:String[255];
    KolVo:Integer;
    Summ:Comp;
  end;
  TCommBlock = record
    Command:string[100];
    MyUserName:string[100];
    ReceiverName: string[100];
    Msg:String[255];
    Table:Array[0..99] of TDate;
    Otdel:Byte;
    Summa:Comp;
  end;
 
При передачи этой записи происходит следующее:
При первой передаче все приходит безупречно,
при второй передаче данные как будто смещаются на неопределенное количество байт в право, т.е.  Command,MyUserName,ReceiverName,Msg - приходят пустыми,
а массив Table[0],Table[1]содержит байты которые должны были быть в Command,MyUserName,ReceiverName,Msg, все остальные ячейки Table забиты мусором.
 
Как я выяснил, здесь как минимум две проблемы:
1) массив Table типа TDate в котором есть  Summa:Comp;
2) Summa:Comp;
Если убрать таблицу и убрать Summa тогда данные передаются без искажения.
Так же заметил что если код библтотеки перенести на обычное win приложение то передача данных происходит нормально.
 
Отсюда вывод что в момент динамического создания клиента в библиотеке я где то что то не так делаю, вот код в котором я создаю клиента
  Client:=TIdTCPClient.Create(Nil);
  Client.ASCIIFilter:=False;
  Client.Port:=2001;
  Client.MaxLineLength:=16384;
  Client.MaxLineAction:=maException;
  Client.RecvBufferSize:=32768;
  Client.RecvBufferSize:=32768;
  Client.OnConnected:=ClientConnected;
  Client.OnDisconnected:=ClientDisconnected;
 
Может здесь что то не так...
 
Просьба подсказать что я делаю не так. Зарание огромное спасибо.

Всего записей: 55 | Зарегистр. 31-05-2005 | Отправлено: 10:39 04-04-2006 | Исправлено: Schatz, 10:40 04-04-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
George_Lucky
Посмотри под каким аккаунтом служба работает. Возможно просто прав не хватает (если файловая система NTFS)
Чтобы понять, запусти под админом -- и увидишь работает вобще, или нет
 
Добавлено:
Schatz
Ну во первых
Код:
The Comp (computational) type is native to the Intel processor architecture and represents a 64-bit integer. It is classified as a real, however, because it does not behave like an ordinal type. (For example, you cannot increment or decrement a Comp value.) Comp is maintained for backward compatibility only. Use the Int64 type for better performance.

Если проблема действительно в этом... - можно поробовать заменить на Инт64

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 10:50 04-04-2006
Schatz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vshersh

Цитата:
Если проблема действительно в этом... - можно поробовать заменить на Инт64

 
Попробовал перебрать все доступные типы и целые и вещественные, все равно второй раз приходит мусор.
 
Добавлено:
Кажется нашел проблему.
При передачи данных  
  CB:TCommBlock;
  SizeOf(CB)=1104
При приеме данных
  CB:TCommBlock;
  SizeOf(CB)=1194
 
Но при этом и на сервере и в клиенте тип TCommBlock - это одна и та же запись, с точностью до запятой.
 
Почему же EXE'шник считает что моя запись весит 1104 а DLL'ка говорит что вес моез записи 1194, на 90 байт больше, не понимаю.
 
Добавлено:
Вот только понять теперь не могу что мне делать, надо либо в клиенте массив уменьшать и подгонять его под "размер" сервера, либо выкручиваться каким то другим способом.
Сейчас попробую выяснить что за тип мне такие пакости в массиве сделал.

Всего записей: 55 | Зарегистр. 31-05-2005 | Отправлено: 11:10 04-04-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Schatz
Попробуй объявить packed record и после этого сравнить размеры

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 11:23 04-04-2006
Schatz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Попробуй объявить packed record и после этого сравнить размеры

Можно поподробнее про packed record, я просто не совсем понял

Всего записей: 55 | Зарегистр. 31-05-2005 | Отправлено: 11:35 04-04-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Schatz

Код:
  TDate=packed Record  
    NumberString:Byte;  
    Text:String[255];  
    KolVo:Integer;  
    Summ:Comp;  
  end;  
  TCommBlock = packed record  
    Command:string[100];  
    MyUserName:string[100];  
    ReceiverName: string[100];  
    Msg:String[255];  
    Table:Array[0..99] of TDate;  
    Otdel:Byte;  
    Summa:Comp;  
  end;

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 11:38 04-04-2006
Schatz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vshersh
В библиотеке объявление packed Record никак не повлияло на размер записи, а вот в приложении размер уменьшился, но недостаточно.

Всего записей: 55 | Зарегистр. 31-05-2005 | Отправлено: 11:49 04-04-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Schatz
Чтото там не так...
Не может быть разный размер.
Я советую вобще описание записей (с packed) вынести в отдельный юнит и юзать его в 2-х проектах.  
Попробуй для эксперимента просто передать запись, например, с 1 строкой и одним числом:
Код:
TTestRec = packed record  
  str: string[10];
  dbl: double;
end;

размер и в приемнике и в передатчике д.б. 18
Проверь что у тебя получится

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 11:53 04-04-2006
Schatz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vshersh
Огромное спасибо, очень сильно помог
 
Вынес описание типов в отдельный юнит, прописал packed record, теперь и в приемнике и в передатчике одинаковый размер.
 
Еще раз огромное спасибо, не первый раз уже выручаешь меня.

Всего записей: 55 | Зарегистр. 31-05-2005 | Отправлено: 11:56 04-04-2006
Markell



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, плз, каким образом в Delphi под Win32 можно указать символ ' (апостроф) посередине стринговой строки? Т.е., если я хочу вывести на печать кусочек текста, где встречается такой символ ',  то он обрывает эту строку вывода, а надо, чтобы он был ее частью..

Всего записей: 103 | Зарегистр. 05-10-2004 | Отправлено: 15:39 04-04-2006
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Markell
Пиши его 2 раза подряд - ''

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 15:44 04-04-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Markell
делаешь тройный ковычки (апострофы)  
вот так  'Привет '''+' ЧУВАК!!!';

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:47 04-04-2006 | Исправлено: DroN_S, 15:49 04-04-2006
waik



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Markell
Поставь два апострофа подряд... Типа такого:  
Stroka := 'Это пример для '' и его использования в строке';
 
Stroka будет равна "Это пример для ' и его использования в строке"
 
Ну или через chr(код символа) и плюсом складывай

Всего записей: 610 | Зарегистр. 15-01-2003 | Отправлено: 15:47 04-04-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
waik

Цитата:
Stroka := 'Это пример для '' и его использования в строке';

ты не прав, так у тебя оборвётся строка...

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:50 04-04-2006
Z MeZe



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Markell

Цитата:
вот так  'Привет '''+' ЧУВАК!!!';


Цитата:
Stroka := 'Это пример для '' и его использования в строке';

И тот и другой вариант правильные.
DroN_S
Прежде чем говорить:
Цитата:
ты не прав, так у тебя оборвётся строка...
,
вставь в дельфи и проверь

Всего записей: 455 | Зарегистр. 09-02-2004 | Отправлено: 16:07 04-04-2006 | Исправлено: Z MeZe, 16:11 04-04-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru