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

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

Автор: mdid
Дата сообщения: 02.07.2009 12:21
откатить вряд ли...indy это такой же компонент как и все остальное...можно удалить и установить Components->Install Packages
еще советовал бы посетить www.indyproject.org и глянуть что там с версиями..
у меня был вроде какой то Overbyte иль чет похожее...я правда потом забросил это дело так как на работе напряг был...а потом лень возвращаться было
но если хотите портить себе нервы с Indy ваше право....если разберетесь стукните в личку...интересно просто
Автор: xp3n
Дата сообщения: 02.07.2009 17:04
помогите решить задачу!!
есть 2 строки:
http://forum.ru-board.com/index.php
http://forum.ru-board.com/index.php =
в RegexBuddy составил регулярное выражение:
^http((?!=).)+$
он выделил только первую строку, но в TestRExp (использую этот компонент) это же выражение не работает, что нужно изменить чтобы оно заработало именно в TestRExp?
Автор: volser
Дата сообщения: 02.07.2009 17:12
xp3n
Попробуйте этот компонент.
Автор: xp3n
Дата сообщения: 02.07.2009 17:26
так я им и пользуюсь. TestRExp - это программа этого же разраба для проверки выражений. и мне нужно решить задачу с помощью него, а не RegexBuddy.
Автор: SerGap
Дата сообщения: 04.07.2009 18:39
Такой вопрос - возникла потребность в ProgressBar'е, но нужно чтоб он появлялся на форме в нужный момент, показывал процесс выполнения определенных действий, и потом исчезал. Код примерно такой:

procedure TForm1.Button1Click(Sender: TObject);
var
a, b : boolean;
Source, Target : string;
i : integer;

begin
ProgressBar1.Visible:=True;
a:=False;
b:=True;

for i:=0 to 20 do
begin
Source:='источник';
Target:='цель';
if DirectoryExists(Source) then FullDirectoryCopy(Source,Target,a,b);
ProgressBar1.Position:=i*10;
ProgressBar1.Repaint;
end;

ProgressBar1.Visible:=False;
end;

Все работает хорошо... без строки ProgressBar1.Visible:=False;
т.е. процесс идет - вижу как заполняется прогрессбар. Но как только прописываю эту строку - все, вместо процесса быстрое появление и исчезновение незаполненного прогрессбара. Может кто что посоветует по этому поводу?
Автор: kveplim
Дата сообщения: 04.07.2009 20:58

Цитата:
т.е. процесс идет - вижу как заполняется прогрессбар. Но как только прописываю эту строку - все, вместо процесса быстрое появление и исчезновение незаполненного прогрессбара. Может кто что посоветует по этому поводу?

application.processmessages в цикл вставь

Цитата:
Возникла проблема с Indy в Delphi 2009 (врочем как и в C++Builder 2009).
Пытаюсь реализовать механизм отправки сообщения на e-mail. Использую компоненты TIdSMTP и TIdMessage. Сообщения приходят нормально, но в совершенно нечитабельном виде... проблема с кодировкой. Два часа в гугле ничего не дали...

на next/plain charset не повлияет, лучше в виде html отправляйте.[q][/q]
Автор: SerGap
Дата сообщения: 04.07.2009 22:02
kveplim

Цитата:
application.processmessages в цикл вставь

Пробовал, не спасает.
Автор: Ramazan
Дата сообщения: 05.07.2009 00:41
SerGap
А условие

Цитата:
DirectoryExists(Source)

выполняется? Я имею в виду, что, возможно, все проходит СЛИШКОМ быстро. Опять же, у ProgressBar Min Max как выставлены - судя по коду, должны быть от 0 до 200.

PS: У меня на тестовой форме представленый кусок кода работает, как и было заявлено, так что, проблема, скорее всего, не в этом.
Автор: SerGap
Дата сообщения: 05.07.2009 08:47
Ramazan
Да, условие выполняется. Числа 0 и 20 здесь условны, но в коде min и max соблюдены.
Весь код в цикле выполняется быстро, да. Но как писал, без строки ProgressBar1.Visible:=False;
все абсолютно корректно, т.е. процесс виден, идет плавно и т.д. Здесь вот какой момент.. делаю я это на RAD Studio Weaver Beta build 14.0.3462.22361.1
и получается это его проблемка или механизм отрисовки ProgressBar'а изменен и я не учитываю какой-то нюанс, потому что не знаю про него.
Сейчас впечатление такое, что с этой строкой, копирование файлов еще продолжается (по звуку hdd), а код уже отрабатывает отключение прогрессбара.

P.S. глянул реализацию прогрессбара в Delphi 2009 handbook, сделал как там и визуально код заработал как надо, с видимым заполнением прогрессбара по мере выполнения процесса.
Вместо
....
ProgressBar1.Position:=i*10;
ProgressBar1.Repaint;
end;

теперь
....
ProgressBar1.Position:=i*10;
Application.ProcessMessages;
Sleep (100);
end;
уж не знаю насколько это корректно, но работает.
Автор: RedPromo
Дата сообщения: 05.07.2009 22:17
IndII
Обновить Инди смотреть тут, на sql.ru/forum/ уже обсуждалось, проблема решалась.

Добавлено:
SerGap
Вобще корректно, но я еще не видел чтобы для красоты постепенного заполненения прогрессбара замедляли выполнение операции
Цитата:
Sleep (100);
.
Автор: SerGap
Дата сообщения: 06.07.2009 00:21
RedPromo
Это не для красоты абсолютно. Без этого нет отрисовки процесса вообще.
Я ведь вроде подробно описал свою проблему и как к этому решению пришел.
Вообще, по уму, надо бы как-то отследить когда реально копирование файлов закончилось и тогда отключать прогрессбар. Вот только как этот момент отследить...
Сейчас впечатление такое что копирование отправляется в отдельный процесс, а прога бежит дальше выполнять код, а следующее по коду - выключение прогрессбара. Вот она берет и отключает его, а в это время копирование ещё идет. Выглядит это как простое появление и моментальное отключение прогресс бара.
Кто знает, может это особенность Weaver'а втихомолку отдельные процессы запускать, а может Вин7 тому виной...
Автор: ShIvADeSt
Дата сообщения: 06.07.2009 02:11

Цитата:
Сейчас впечатление такое что копирование отправляется в отдельный процесс, а прога бежит дальше выполнять код, а следующее по коду - выключение прогрессбара.

В общем прежде чем писать такой код надо вначале разобраться как работает данная процедура - вот код
[more]

Код:
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Копирование содержимого директории, вместе с поддиректориями.

Фукция копирует СОДЕРЖИМОЕ директории SourceDir в директорию TargetDir.
Копируются все файлы, подкаталоги, и файлы находящиеся в этих подкаталогах.

Аргумент StopIfNotAllCopied: если значение этого аргумента = True,
то при первой же ошибке копирования файла или папки, работы функции
прекратится а функуция вернёт False. В случае если этот аргумент = False,
то ошибки копирования учитываться не будут.

Аргумент OverWriteFiles: если True, то существующие файлы будут переписаны.

Зависимости: SysUtils, FileCtrl, Windows
Автор: VID, snap@iwt.ru, ICQ:132234868, Махачкала
Copyright: VID
Дата: 31 января 2003 г.
***************************************************** }

function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean;
var
SR: TSearchRec;
I: Integer;
begin
Result := False;
SourceDir := IncludeTrailingBackslash(SourceDir);
TargetDir := IncludeTrailingBackslash(TargetDir);
if not DirectoryExists(SourceDir) then
Exit;
if not ForceDirectories(TargetDir) then
Exit;

I := FindFirst(SourceDir + '*', faAnyFile, SR);
try
while I = 0 do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attr = faDirectory then
Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
StopIfNotAllCopied, OverWriteFiles)
else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
then
Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
SR.Name), False)
else
Result := True;
if not Result and StopIfNotAllCopied then
exit;
end;
I := FindNext(SR);
end;
finally
SysUtils.FindClose(SR);
end;
end;
Автор: Cryogen2003
Дата сообщения: 06.07.2009 09:07
volser
Есть права в Мои документы, но и это далеко не у всех. Так что сейчас запускается Excel сам и в нем уже все динамически создается (ничего особенного, просто колонки с текстом). Вот и хочу сделать все это же самое, но с поддержкой OpenOffice.
Просто можно конечно создавать xls с помощью компонентов прямого создания файлы xls, но это решит только 70 процентов проблем у пользователей, а у остальных 30 процентов будет все так же.

spasius
НУ я знаю, в принципе подходит EMS Advanced Data Export Component Suite или то, что ты назвал. Но хотелось бы именно для динамического запуска OpenOffice и в нем автоматического создания всей той инфы, которую нужно показать пользователю.

Если понадобиться, то могу текущий свой самописный класс показать
Автор: SerGap
Дата сообщения: 06.07.2009 09:45
ShIvADeSt

Цитата:
то есть у тебя происходит 20 раз копирование одной и той же директории с места на место

Это не так, в коде, который я привел здесь, просто для наглядности написано так:
Source:='источник';
Target:='цель';
в моем же реальном коде, естественно Source и Target вычисляются и подставляются каждый раз новые в процессе выполнения цикла.


Цитата:
Я в принципе это и предполагал, так как у этой функции нет параметра для прогресс бара

Как нет? А это?
for i:=0 to 20 do
.......
ProgressBar1.Position:=i*10;
.......


Цитата:
В ней вначале получаешь размер всех файлов..

У меня другая проблема, мне не нужен прогрессбар зависящий от общего размера файлов. У меня кучка маленьких файлов, поэтому смысла заморачиваться на привязку к общему размеру нет. Т.е. вполне, в этом конкретном случае, полностью устраивает привязка к количеству файлов.


Цитата:
.. надо вначале разобраться как работает данная процедура..
..то есть она не возвращает управление пока не закончится

Вот как раз похоже на то что в моем случае возвращает, может из-за этого и проблема.

Попробую резюмировать:
1. Если я НЕ прописываю после завершения цикла строку
ProgressBar1.Visible:=False;
то все нормально отображается, т.к. процесс копирования начался, а программа
побежала дальше по коду, НО... прогрессбар не отключен и у него есть время
нормально отрисоваться.
2. Если прогрессбар выключить сразу после цикла, то как писал впечатление отправки
копирования в отдельный процесс и мгновенное отключение прогр.бара.
3. Вполне допускаю что это особенность Weaver'а, поэтому было бы неплохо найти
способ отслеживания момента физического завершения процесса копирования
и после этого выключать прогрессбар.
4. Sleep(100) пока что является единственным способом дать шанс прогрессу
отобразиться именно в процессе копирования.


Автор: Frodo_Torbins
Дата сообщения: 06.07.2009 10:28
Cryogen2003
А как OpenOffice реагирует, когда в него из браузера табличку копируешь? Просто можно попробовать формировать в памяти html-страничку, а потом через буфер обмена вставлять. Но это конечно только если в ячейках будет обычный текст.
Автор: Cryogen2003
Дата сообщения: 06.07.2009 12:21
Frodo_Torbins
Хреново реагирует как-то. Тем более все равно надо сделать полный автомат, а не чтоб пользователь вставлял из буфера обмена сам. Так что уже много чего передумал на эту тему, самое легкое подготовить файл и его открыть через обычный ShellOpen. Но опять же проблема в том, что у процентов 30 пользователей прав на запись как класс нет.
Автор: volser
Дата сообщения: 06.07.2009 12:31
SerGap
Попробуйте использовать Timer. После завершения цикла запустить таймер, после срабатывания скрыть прогрессбар.
Автор: SIgor33
Дата сообщения: 06.07.2009 13:06
вопрос такой где что поменять у TMSDump чтобы поля формата datetime выгружались в таком вот формате '21.12.2009' ('dd.mm.yyyy'), а не поумолчанию '2009-12-21 00:00:00' (yyyy.mm.dd hh:mm:cc)
Автор: SerGap
Дата сообщения: 06.07.2009 13:27
volser

Цитата:
Попробуйте использовать Timer...

Вот, честно говоря я так по началу и сделал, но он ведь будет всегда через определенное время отключать прогрессбар. Если будет отключать через дольшее время чем идет копирование - то не страшно. А если копирование "забуксует" - то внешне можно будет подумать что копирование завершено (таймер ведь все-равно прогрессбар отключит), а это уже совершенно не правильно.
Автор: volser
Дата сообщения: 06.07.2009 13:28
SerGap
Таймер включать после выполнения цикла. В таймере отключать сам таймер.
Автор: SerGap
Дата сообщения: 06.07.2009 13:49
volser
Да, именно так и делал.

Вобщем мне кажется ShIvADeSt натолкнул на правильную мысль насчет FullDirectoryCopy, видать ее надо править под новые сборки Delphi, чтобы она не давала выполнятся коду дальше пока она полностью не отработает.
Автор: volser
Дата сообщения: 06.07.2009 13:56
SIgor33
Данные для скрипта берутся через AsString. Поскольку у вас тип поля DateTime, то значения получают так StrToDateTime. Для того чтобы данные были без времени приведите типы полей в самом запросе к типу дата. Бекап делайте через BackupQuery. Чтобы был правильный формат для даты опишите его здесь ShortDateFormat.
Автор: SIgor33
Дата сообщения: 06.07.2009 14:54
volser
Во первых TMSQuery не нашел процедуры BackupQuery. Ткните меня носом.
А во вторых использую TMSDump имено потому что делаю дамп нескольких таблиц вот отсюда вопрос и возник
Автор: volser
Дата сообщения: 06.07.2009 15:11
SIgor33
Почему TMSQuery если вы работаете с TMSDump? Сейчас в наличии нет MSDac, есть только UniDac, так что могут быть некоторые неточности. Вы можете сделать наследника TDADumpProcessor, у которого перекрыть метод BackupData. Дальше в классе TMSDump перекрыть метод GetProcessorClass, указав свой процессор.
Автор: Cryogen2003
Дата сообщения: 06.07.2009 15:40
volser
Frodo_Torbins
Нашел в инете описание, как работать с OpenOffice. Буду по этому описанию стало быть дописывать код
Автор: SIgor33
Дата сообщения: 06.07.2009 15:47
volser
Незнаю как будет работать ваш метод сложновато как то.
Я в исходники где MSDump изменил dateformat все пошло.
Только не известно как поведет себя на сервере где формат даты будет отличаться от европеийской
Автор: delover
Дата сообщения: 06.07.2009 17:18
All
Уважаемый алл . Хотя это скорее не вопрос, но далее я поясню. Хочу поздравить всех посетителей этого топика (в первую очередь) и с двумя событиями.
Первое не такое грандиозное - второго числа Microsoft выпустила сервис-пак 2 для Vista. Молодцы, - во первых символичная дата 02.07.2009. Сервис-пак 2, а у них ещё и система - семёрка. Во вторых выпустили они её ровно за четыре дня до 40000-го дня.
С 40000-м днём всех!!!

Сегодня DateTime1 := Trunc(Now); вернёт вам 40000! По какому календарю не помню, но это сегодня умеет делать Delphi!!!!
Автор: delover
Дата сообщения: 06.07.2009 19:30
ps
Незнаю, если я правильно понял Юлианский календарь отсчитывает дни от Рождества Христова. Григорианский, которым пользуемся и мы вносит некоторые тонкости о количестве дней в году и отсчитывает дни с конца 1899-го года (т.е.) с начала 1900-го. Вот именно с 1900-го года прошло сорок тысячь дней. Довольно реткое событие, с чем и поздравляю.
Автор: OOD
Дата сообщения: 07.07.2009 12:59
Подскажите гуру Delphi есть dbf файл к которому подключен с delphi 7 ...
В DbGrid font.charset стоит OEM_CHARSET данные отображаются почти нормально , за исключением отсутствия украинской буквы "і", но это не так страшно.... не могу вбить данные вбивая их на русском , они вбиваются но после этого отображаются в неправильно кодировке (иероглифами..) как их вбивать через DbGrid сразу в кодировке OEM_CHARSET?
Автор: volser
Дата сообщения: 07.07.2009 13:11
OOD
Какие компоненты доступа к данным используете?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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