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

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

Автор: AntonVA1
Дата сообщения: 11.10.2007 15:01

Цитата:

Не обязательно. Если все dataset-ы исходно закрыты, а открываются только при активации соответствующих форм, то все вполне неплохо - при активации формы - данные актуальны, а при закрытии (и закрытии датасета) - записываем изменения.
Да и необходимость тащить ВСЮ базу - преувеличена. Если тащить только нужное - то можно все датасеты открыть сразу. Ну подождет юзер секунды 3-5. Зато формы потом мгновенно будут выстреливаться

Согласен, все зависит от реализации, можно открывать только в onshow.
Но вручную вормы нужно обязательно! Читаем классику (Стив Тейксейера Ксавье Пачеко Delphi 5 для разработчика Том 1 стр. 230)

Цитата:
Все остальные формы ДОЛЖНЫ БЫТЬ УДАЛЕНЫ из списка автоматического создания, расположенного в диалоговом окне Project Options

и далее

Цитата:
Все модули форм должны содержать функцию реализации формы, которая предназначена для создания, настройки, отображения... и т.д.

Стоит не забывать, что память все еще нужно экономить, что бы не создавать монстров а-ля Виста
Автор: demonster666
Дата сообщения: 11.10.2007 17:37

Цитата:
АААААААААААААА!!!!!!!!!! ПРИВЕТ ВСЕМ!!!!!!!! Люди! подскажите как в Дельфи можно написать прогу чтобы она лазила браузером Опера (по wml-страницам) с заданной периодичностью.


Цитата:
В каком смысле? Оперой управлять

Да. прогу для управления Оперой.
Или хоть как Дельфи можно wml страницы просматривать?
Автор: RedPromo
Дата сообщения: 11.10.2007 19:02
demonster666
Мне кажется данную задачу можно решить с помощу скрипта.
Автор: demonster666
Дата сообщения: 11.10.2007 21:42
RedPromo
че за скрипт? я тока в дельфи немного умею програмить. а его встроеный брайзер wml не распознает вроде. ПОМОГИТЕ!!!
Автор: nuker2015
Дата сообщения: 11.10.2007 21:59
по скриптам и DOM http://dev.opera.com/
а тут http://www.winwap.com/ найдешь SDK для работы с WML. Ведь тебе не сама опера нужна а WML браузер, так?
Автор: RomanTim
Дата сообщения: 11.10.2007 23:42
Armag3000
Поток он на то и поток - определенная последовательность операций, выполняющихся по очереди, не видел нигде, чтобы как-то этому помогала многопроцессорность.
Попробуй посмотреть что по потокам происходит в дубе при запуске так и из под кнота, например процессэксплорером, в конце концов скачай исходники кнота - на делфях писано - и посмотри что да как там делается.
Автор: DmitryKz
Дата сообщения: 12.10.2007 02:36
Подскажите, пожалуйста:
есть вызов функции в операторе

if ChkSubDirs(TreeViewFolders.Path)=False then

сама функция, описанная в разделе implementation:

function ChkSubDirs(sInitDir:string):Boolean;
var
srSearch: TSearchRec;
sSearchPath: string;
begin
sSearchPath := sInitDir+'\';
ChkSubDirs := False;
if FindFirst(sSearchPath + '*', faDirectory, srSearch) = 0 then ChkSubDirs := True;
end;

При компиляции никаких ошибок, но функция не работает. При попытке отследить значения выражений и переменных в окне Watches пишется:
FindFirst - Not enough actual parameters
ChkSubDirs - Not enough actual parameters

В чем я ошибся? Я уже глаза протер в поисках кривизны - ничего не вижу.
Автор: RomanTim
Дата сообщения: 12.10.2007 07:01
DmitryKz
Отладчик тоже не всесильный - нормально обработать довольно сложную функцию FindFirst, котрая к тому же еще через var-параметр возвращает результат он скорее всего не может даже вызвать.
Зайди в свойства проекта, в параметрах компилятора включи "Use debug DCUs", и тогда сможешь во время отладки зайти внутрь FindFirst

Ну и из разряда вкусовщины
"ChkSubDirs(TreeViewFolders.Path)=False" имхо лучше писать
"not ChkSubDirs(TreeViewFolders.Path)"

Результат функции лучше присваивать не переменной с именем функции, а переменной Result:
Result := False;
if FindFirst(sSearchPath + '*', faDirectory, srSearch) = 0 then Result := True;
Автор: SergeBS
Дата сообщения: 12.10.2007 08:19
RomanTim
Ну уж тогда так:
result := not (FindFirst(sSearchPath + '*', faDirectory, srSearch) = 0);
DmitryKz

Цитата:
sSearchPath := sInitDir+'\';

Не так!
sSearchPath := IncludeTrailingBackSlash(sInitDir);
А ошибка - TreeViewFolders.Path = nil (пустая строка, '')
Вот и нет параметра вызова у ChkSubDirs


Добавлено:
И вообще зачем такие сложности. Есть DirectoryExists function
Автор: MDMDVD
Дата сообщения: 12.10.2007 08:36
Столкнулся с такой проблемой
Есть программа для управления базой данных
Драйвер Paradox
Необходимо следующее Имеется два поля типа DBEdit1 и 2
В таблицах парадокса ячейки имеют тип Number я написал код
который преобразовывает StrToInt и выполняю сложение или деление этих полей
вПри компиляции пишет несовместимые типы Integer/Extended
Подскажите как правилбно сделать
Автор: RedPromo
Дата сообщения: 12.10.2007 09:16
MDMDVD
Результат деления всегда будет дробное.
проверь тип переменной которая принимает результат либо привети результат к integer.

Вот тебе подсказка как привести к типу int.

Код: System.Frac
System.Round
System.Trunc
Автор: demonster666
Дата сообщения: 12.10.2007 09:56
nuker2015

Цитата:
по скриптам и DOM http://dev.opera.com/
а тут http://www.winwap.com/ найдешь SDK для работы с WML. Ведь тебе не сама опера нужна а WML браузер, так?


Про скрипты есть инфа на русском?
Мне нужно узнать как в Дельфи можно получить данные с wap-сайтов? Тоесть программа должна просматривать wml страницы и брать с них текстовую информацию, с которой я уже более-менее могу програмно разобраться и сам. help!
Автор: greenpc
Дата сообщения: 12.10.2007 10:00
RomanTim
FindFirst(sSearchPath + '*.*', faDirectory, srSearch) = 0
Автор: RedPromo
Дата сообщения: 12.10.2007 10:49
demonster666
Мне кажется тут тебе Opera совсем не кчему, выше nuker2015 тебе давал на ссылку на SDK, тебе скорее всего нужен парсер WML, либо руками. Тут описание формата Ссылка
А получать можно в делфи с помощу Indy.
Автор: Aladdinych
Дата сообщения: 12.10.2007 14:24
Есть DbGrid подключенный к датасету. Одна из колонок булевская.
Как сделать, чтобы в колонке вместо значения отображался checkbox?
Автор: DmitryKz
Дата сообщения: 12.10.2007 16:43
RomanTim
Да я так и писал, просто когда увидел, что функция не работает, стал "упрощать" код
Спасибо за ценные советы. У меня все равно не работает функция FindFirst так, как хочу.
SergeBS
Насколько я понял, функция DirectoryExists проверяет существование каталога с конкретным именем. Мне же необходимо узнать, существует ли по указанному пути (т. е. в данном конкретном каталоге) хоть один подкаталог (не файл). Фунция FindFirst не работает как я хочу, запускаю ее в таком виде:

Result := (FindFirst(sSearchPath + '*', faDirectory, srSearch) = 0);

Но она всегда возвращает истину, вне зависимости от того, существуют в ней подкаталоги или нет. Что не так делаю?
Автор: nuker2015
Дата сообщения: 12.10.2007 16:46

Цитата:
Про скрипты есть инфа на русском?
Мне нужно узнать как в Дельфи можно получить данные с wap-сайтов? Тоесть программа должна просматривать wml страницы и брать с них текстовую информацию, с которой я уже более-менее могу програмно разобраться и сам. help!

Раз тебе рендеринг ненужен, то ничего сложного нет:
получаешь страницу wml любой библиотекой по http,
а wml можно разобрать DOM парсером так как он базируется на XML, возьми вот тут например:
http://omnixml.com
http://htmlp.sourceforge.net
Инфу по WML ищи тут: http://ru.wikipedia.org/wiki/WML на русском, или на w3c.org

Автор: Genri
Дата сообщения: 12.10.2007 17:03
DmitryKz -- вероятно, функция FindFirst находит директории "." и "..".
Автор: DmitryKz
Дата сообщения: 12.10.2007 17:08
Genri
И что теперь делать? Что использовать?
Автор: Genri
Дата сообщения: 12.10.2007 18:05
DmitryKz -- примерно так (програмеры поправят):

Код:
function ChkSubDirs(sInitDir:string):Boolean;
var
srSearch: TSearchRec;
sSearchPath: string;
res: integer;
begin
sSearchPath:= sInitDir+'\';
Result:= False;

res:= FindFirst(sSearchPath + '*', faDirectory, srSearch);

while (res = 0) and
((srSearch.Name = '.') or
(srSearch.Name = '..')) do
res:= FindNext(srSearch);

Result:= res = 0;
end;
Автор: DmitryKz
Дата сообщения: 12.10.2007 19:51
Genri
Почти все работает, но функция все равно дает положительный результат, даже если в каталоге нет подкаталога, но есть файл. Как бы сделать так, чтобы существование файлов игнорировалось? Проверка только на наличие или отсутствие подкаталогов.

Добавлено:
пробовал добавить в FindFirst "and not faAnyData", но не сработало.
Автор: SERGE_BLIZNUK
Дата сообщения: 12.10.2007 20:41
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;
Автор: DmitryKz
Дата сообщения: 12.10.2007 21:10
SERGE_BLIZNUK
Да где ж узнать, как она работает? У Архангельского объяснений ее работы нет, только описание параметров, а как ими пользоваться - нет. Код рабочий, я это уже сообщил. Я добавил только FindClose на выходе из функции.

Добавлено:
SERGE_BLIZNUK
Спасибо большое - поизучал твой код, все логично ну и, конечно, работает!
Автор: SERGE_BLIZNUK
Дата сообщения: 12.10.2007 21:59
DmitryKz
ну, я лично это ещё из досовского TurboPascal помню...
кстати, это просто обёртка надо вызовом DOS функций, таким образом можно подробнейшее описание найти в описании функций 21 прерывания (например, Interrupt list by Ralph Brown)

ВАУ!!! Вот, только что нашёл в сети - про глюк MS DOS [more=Как отличить файл от каталога]
FIL. Как отличить файл от каталога Sly Golovanov 27.12.1997
Учет особенностей поиска каталогов с помощью FindFirst и FindNext.
Pascal FAQ created by SLY Golovanov, 2:5020/278.13
(slightly corrected by Valery Votintsev 2:5021/22)
=================================================================

Q:> Ищу я все подкаталоги в данном каталоге
процедурой FindFirst('*.*',Directory,Search),
а она мне не только подкаталоги, но и все файлы находит.
В чем дело?

A: Глюк MS-DOS.
А именно, функции 4E прерывания 21.
Hужно после каждого использования FindFirst/FindNext проверять,
каталог ли ты нашел:

if (Search.Attr and Directory) <> 0 then begin [...] end;

[/more]

по поводу FindFirst, вот, что написано у Архангельского в help файле:
:Base D5Ophlp1
:Title Object Pascal и Delphi 5, версия 5.1
Из приложения к книге Архангельского А.Я. "Программирование в Delphi 5".
[more]
FindFirst( const Path: string; Attr: Integer; var F: TSearchRec): Integer    Выделяет в памяти необходимые ресурсы для поиска в каталоге и шаблоне Path (например, c:\MyDir\*.*) файлов, удовлетворяющих шаблону и имеющих атрибуты Attr (см. FileSetAttr). При успешном завершении возвращает 0, в противном случае - код ошибки Windows. Результаты поиска заносятся в запись SearchRec. Из полей этой записи можно извлечь результаты: Time: Integer - время создания файла, Size: Integer - его размер, Attr: Integer - его атрибуты, Name - имя файла и некоторые другие.

FindNext( var F: TSearchRec): Integer    Продолжает поиск, начатый функцией FindFirst. Если нашелся новый файл, возвращает 0, в противном случае - код ошибки Windows. Результаты поиска заносятся в запись SearchRec (см. FindFirst).
[/more]
если нужно - я положил этот файл на Рапиду delphi5ophlp.rar
Автор: DmitryKz
Дата сообщения: 12.10.2007 22:17

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

Действителльно Вау! Капец нюансик. Это ж как же можно париться и ломать голову, не зная о существовани таких вещей?! Электронная справка Архангельского у меня установлена - безмерный респект за внимание

Добавлено:
Хотя, конечно, сочетание "if Search.Attr and (Directory <> 0) then " в различных примерах используется, но без комментов.

Добавлено:
Существует ли в Дельфи понятие фильтрации событий?
К примеру, пользователь ставит флажок в CheckBox, программа перехватывает событие OnClick, возникающее при этом и проверяет наличие определенных условий правомочности установления флажка, и если установка флажка некорректна, показывает соответствующее сообщение и сбрасывает флажок на выходе из процедуры обработки события. Но при этом опять генерируется событие OnClick CheckBox'а. Своего рода замкнутый круг.
Автор: SERGE_BLIZNUK
Дата сообщения: 12.10.2007 23:06
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;
Автор: DmitryKz
Дата сообщения: 12.10.2007 23:14

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

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

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

Из родной:

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

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

Добавлено:
Первый метод, имхо, лучше - не надо тратится на время и память. Спасибо!
Автор: demonster666
Дата сообщения: 13.10.2007 17:54
nuker2015
RedPromo
Ребята спасибо. Пойду разбираться. и английский вспоминать
Автор: dmit000
Дата сообщения: 13.10.2007 21:22
Всем привет!

имеется код для текстового поля для ввода только чисел и разделителя:

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;

Вопрос:
Как сделать так чтобы этот код действовал на все текстовые поля на форме?
и
Просьба:
Может кто поможет написать такой текстовой компанент с указанным обработчиком (кодом)
Автор: LLKamikadze
Дата сообщения: 14.10.2007 06:48
У меня имеются в базе поля.
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 или что?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


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