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

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

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

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Genri
Почти все работает, но функция все равно дает положительный результат, даже если в каталоге нет подкаталога, но есть файл. Как бы сделать так, чтобы существование файлов игнорировалось? Проверка только на наличие или отсутствие подкаталогов.
 
Добавлено:
пробовал добавить в FindFirst "and not faAnyData", но не сработало.

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 20:51 12-10-2007
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
проблема у Вас в том, что Вы не понимает, как работает FindFirst... (и, кстати, к ней ещё идёт FindNext)
эта функция находит первый объект файловой системы, попадающий под маску и переданный тип...
в любой папке всегда есть две служебные записи файловой структуры, которые, как раз имеют аттрибут faDirectory - это директория с именем '.' и директория с именем '..'
 
о!.. пока собрался писать, увидел, что Genri уже предложил Вам готовый рабочий код!!!
 
Добавлено:
DmitryKz
 
Дальше всё страньше и страньше.. теперь и я не понимаю, почему не работает FindFirst...
проблема в том, что несмотря на переданный ей параметр faDirectory
она всё равно находит и файлы и каталоги...
 
попробуйте такую функцию:

Код:
 
function ChkSubDirs(sInitDir:string):Boolean;
  var
   srSearch: TSearchRec;
   sSearchPath: string;
   res: integer;
  begin
    sSearchPath:= sInitDir+'\';
    Result:= False;
 
    res:= FindFirst(sSearchPath + '*', faAnyFile, srSearch);
 
    while (res = 0) and Not Result do begin
      if (srSearch.Attr and faDirectory)<>0 then begin
        if Not ((srSearch.Name = '.') or
                   (srSearch.Name = '..')) then  Result := true
      end;
      res:= FindNext(srSearch);
    end;
    FindClose(srSearch);
  end;
 
{это для проверки...}
procedure TForm1.Button1Click(Sender: TObject);
begin
 if ChkSubDirs(Edit1.Text) then Label1.Caption := 'Есть подкаталоги'
 else Label1.Caption := 'нет подкаталогов!'
end;
 


Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 21:41 12-10-2007 | Исправлено: SERGE_BLIZNUK, 22:06 12-10-2007
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SERGE_BLIZNUK
Да где ж узнать, как она работает? У Архангельского объяснений ее работы нет, только описание параметров, а как ими пользоваться - нет. Код рабочий, я это уже сообщил. Я добавил только FindClose на выходе из функции.
 
Добавлено:
SERGE_BLIZNUK
Спасибо большое - поизучал твой код, все логично ну и, конечно, работает!

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 22:10 12-10-2007
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
ну, я лично это ещё из досовского TurboPascal помню...
кстати, это просто обёртка надо вызовом DOS функций, таким образом можно подробнейшее описание найти в описании функций 21 прерывания (например, Interrupt list by Ralph Brown)
 
ВАУ!!! Вот, только что нашёл в сети - про глюк MS DOS Как отличить файл от каталога [?]
 
по поводу FindFirst, вот, что написано у Архангельского в help файле:
:Base D5Ophlp1
:Title Object Pascal и Delphi 5, версия 5.1
Из приложения к книге Архангельского А.Я. "Программирование в Delphi 5".
Подробнее... [?]
если нужно - я положил этот файл на Рапиду delphi5ophlp.rar  

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 22:59 12-10-2007
DmitryKz

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

Цитата:
ВАУ!!!  

Действителльно Вау! Капец нюансик. Это ж как же можно париться и ломать голову, не зная о существовани таких вещей?! Электронная справка Архангельского у меня установлена - безмерный респект за внимание
 
Добавлено:
Хотя, конечно, сочетание "if Search.Attr and (Directory <> 0) then " в различных примерах используется, но без комментов.
 
Добавлено:
Существует ли в Дельфи понятие фильтрации событий?
К примеру, пользователь ставит флажок в CheckBox, программа перехватывает событие OnClick, возникающее при этом и проверяет наличие определенных условий правомочности установления флажка, и если установка флажка некорректна, показывает соответствующее сообщение и сбрасывает флажок на выходе из процедуры обработки события. Но при этом опять генерируется событие OnClick CheckBox'а. Своего рода замкнутый круг.

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 23:17 12-10-2007
SERGE_BLIZNUK

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

Цитата:
флажок на выходе из процедуры обработки события. Но при этом опять генерируется событие OnClick  

ну, сейчас ломает проверять... но, мне кажется, что OnClick в этом случае не будет вызываеться!!!! (в отличие от onChange)
но, бороться можно разными способами - начиная от переназначения метода  
 checkbox.OnChange := nil;а в конце checkbox.OnChange := CheckBoxChange
и до банального семафора - переменной, которую в начале процедуры проверяем, потом устанавливаем, в конце сбрасываем (разумеется на Form.onCreate или Form.OnShow надо иницилизировать  bExit := false)
procedure CheckBoxChange(Sender:TObject)
begin
 if bExit Then Exit;
 bExit := true;
<...>  обработка...
 bExit := false;
end;

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 00:06 13-10-2007
DmitryKz

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

Цитата:
ну, сейчас ломает проверять... но, мне кажется, что OnClick в этом случае не будет вызываеться!!!!  

Вызывается, еще как!
Справка Архангельского:

Цитата:
Обычно событие OnClick наступает, если пользователь нажал и отпустил основную кнопку мыши, когда указатель мыши находился на компоненте. Это событие происходит также, если:
...
Приложение изменило свойство Checked индикатора CheckBox.
...

Из родной:

Цитата:
The value of the Checked property of a check box is changed

Я никак не мог понять, почему у меня два раза появляется мое сообщение о некорректности данных. Потом сообразил, когда еще раз в справку глянул.
 
Добавлено:
Первый метод, имхо, лучше - не надо тратится на время и память. Спасибо!

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 00:14 13-10-2007
demonster666



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
nuker2015
RedPromo
Ребята спасибо. Пойду разбираться. и английский вспоминать

Всего записей: 33 | Зарегистр. 23-07-2005 | Отправлено: 18:54 13-10-2007
dmit000



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
 
имеется код для текстового поля для ввода только чисел и разделителя:
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
        case Key of
        '0'..'9':;
        ',','.' : // десятичный разделитель
               begin
                  Key := DecimalSeparator;
                  if Pos(DecimalSeparator,Edit1.Text) <> 0
                     then Key := Char(0);
                end;
        #8:;
        #13 :
        else
        Key:=#0;
        end;
end;
 
Вопрос:
Как сделать так чтобы этот код действовал на все текстовые поля на форме?
и
Просьба:
Может кто поможет написать такой текстовой компанент с указанным обработчиком (кодом)

Всего записей: 483 | Зарегистр. 07-06-2004 | Отправлено: 22:22 13-10-2007
LLKamikadze

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня имеются в базе поля.
  frm_main.ClientDataSet.FieldDefs.Add('Nick', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('Family', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('Name', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('Oth', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeTel', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkTel', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeMobile', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeFax', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkFax', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkPager', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeIndex', ftString, 6, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkIndex', ftString, 6, False);
  frm_main.ClientDataSet.FieldDefs.Add('ICQ', ftString, 10, False);
  frm_main.ClientDataSet.FieldDefs.Add('Msn', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('Yahoo', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('Picture', ftGraphic, 200, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeAddress', ftMemo, 200, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeCity', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeOblast', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeStrana', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('HomeWww', ftString, 40, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkOrganization', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkAddress', ftMemo, 200, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkCity', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkOblast', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkStrana', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkDoljnost', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkOtdel', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkKomnata', ftString, 30, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkIPTel', ftString, 20, False);
  frm_main.ClientDataSet.FieldDefs.Add('WorkWww', ftString, 40, False);
  frm_main.ClientDataSet.FieldDefs.Add('Other', ftMemo, 200, False);
  frm_main.ClientDataSet.FieldDefs.Add('Vip', ftBoolean, 0, False);
 
А для DBComboBox и DBListBox Какой тип сделать ftString или что?

Всего записей: 1 | Зарегистр. 17-09-2007 | Отправлено: 07:48 14-10-2007
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dmit000
А тебе готовые "компанент"ы что не нравятся, если нет тогда вперед че там помогать создай свой компонет с предком TCustomEdit переопредели метод DoKeyPress, помойму так можно, точно не помню.

Всего записей: 559 | Зарегистр. 05-04-2006 | Отправлено: 20:12 14-10-2007
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скажите, существует ли в Дельфи функция - узнать по пути имя папки: т.е., например, на входе - "C:\Documents and Settings\All Users" - на выходе "All Users"?

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 20:26 14-10-2007
RomanTim

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

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 22:04 14-10-2007
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите советом по способу реализации задачи:
Есть список неких элементов, пока я придумал организовать его как строковый двумерный массив: 1-й столбец - имя объекта, 2-й - полный путь к нему. Имя объкта (1-й столбец) по умолчанию совпадает с именем папки, указанной в пути (2-й столбец), но пользователь может изменять это имя. Как я уже сказал, эта инфа организовывается в виде двумерного массива. В визуальном интерфейсе пользователя она отображается в виде ListView со свойством ViewStyle установленным в vsReport (таблица), который и отображает всю инфу, хранящуюся в массиве. Пользователь может добавлять элементы, перемещать в ListView отдельный элемент или группу, сортировать, редактировать (1-й столбец) имя элемента. Проблема в том, что у меня не хватает фантазии, как организвать связь между массивом данных и визуальным компонентом ListView. Если бы речь шла об одномерном массиве, сложностей вроде не вижу - организовал бы в TStrings, или TStringList. Но вот как быть, если массив двумерный? Я пришел к выводу, что надо будет добавлять процедуры управления массивом - добавлене, сортировка, редактирование 1-го столбца и проч., а затем обновлять содержимое ListView. Но может есть обратный путь: сортировка и изменения в визуальном компоненте автоматически (т.е. внутренними методами) изменяют содержимое массива? Буду благодарен за любые советы.

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 00:16 15-10-2007
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DmitryKz
Как вариант - какой-нибудь датасет располагающийся в памяти (стандартный - TClientDataSet) и DBGrid. Правда при таком варианте придется заводить еще поле Order, чтобы организовать нужный тебе порядок следования записей и при вставке новой записи в середину менять это поле у группы других записей.
 
А еще можно не заморачиваться с невизуальной второй копией данных, а работать напрямую с ListView.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 07:50 15-10-2007 | Исправлено: RomanTim, 07:53 15-10-2007
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А если эти данные нужны мне для последущей работы? Для поиска файлов в этих объектах - папках, для последующих запусках приложения, в том числе.

Всего записей: 3147 | Зарегистр. 29-09-2005 | Отправлено: 08:40 15-10-2007
SergeBS



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dmit000
procedure TMyForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (ActiveControl is TEdit) then
    with (ActiveControl as Tedit) do
    begin  
//ну сам сообразишь что
    end
end;

Цитата:
Просьба:
Может кто поможет написать такой текстовой компанент с указанным обработчиком (кодом)  

"Все б вам, хирургам, резать" (с) анекдот

Всего записей: 272 | Зарегистр. 19-04-2005 | Отправлено: 09:36 15-10-2007
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DmitryKz
Так сохраняй их куда-нибудь: можно в реестр, но лучше в файл, формат - как удобней, можно XML, можно просто текст.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 09:50 15-10-2007
dmit000



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeBS
СПАСИБО
 
RedPromo
Всё нормально просто не хочу каждый раз вставлять обработчик KeyPress. Просто завёл бы текстовое поле с таким обработчиком - вставил и не думал бы больше про корректный ввод данных - было бы очень даже нее дурно, но нужно писать компанент, а я не знаю с чего начать.
 
Буду делать как SergeBS подсказал.
 
СПАСИБО

Всего записей: 483 | Зарегистр. 07-06-2004 | Отправлено: 19:00 15-10-2007 | Исправлено: dmit000, 19:01 15-10-2007
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dmit000
Тебе решать, просто не так это сложно как тебе кажется, да и такой подход ИМНО гибче, если правильно написать.

Всего записей: 559 | Зарегистр. 05-04-2006 | Отправлено: 00:29 16-10-2007
   

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru