Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Изменить последовательность обработки переходов...


Автор: Borland_Delphi_6 14.1.2006, 19:57
Привет! Небольшой вопросик, не совсем представляю, какой запрос можно скормить поиску, поэтому сразу спрошу: есть такой вот код (это типа реконструкция):

..................
Код


var
Txt:String; //Глобальная переменная

..................

procedure HttpGet.GetString;
begin
Txt:='A wonderful message'; //Четвертый шаг
end;

procedure Test;
begin
HTTPGet.URL:=URL; //Первый шаг
HTTPGEt.GetString; //Второй шаг
ShowMessage(Txt); //Третий шаг
end;



Проблема в том, что весь этот код выполняется в описанном порядке, в результате на третьем шаге ShowMessage() выдает пустую строку. Так вот можно ли сделать так, чтобы компилятор сперва выполнял подпрограммы (т.е. HttpGet.GetString здесь), а потом все, что идет ниже? Чтобы данный код выдал мне "A wonderful message", а не пустую строку.

Автор: Susel 14.1.2006, 20:10
Не совсем понятно..... Данный код отрабатывает без проблем и в нужном порядке.....
Может быть в функции HttpGet.GetString создается поток и по его завершении Txt получает значение!?
Добавлено @ 20:12
Нужно бы код по подробнее привести...

Автор: Albinos_x 14.1.2006, 20:22
а что у тебя такое HttpGet....?

Автор: Borland_Delphi_6 14.1.2006, 20:55
Слепал пример, того, чего я хочу добится. Код внутри прокомментирован, компонент HTTPGet из DRKB приложен. Переименуйте gif в rar, иначе не дает грузить сюда smile

Автор: Albinos_x 14.1.2006, 22:04
мдя.... а событие
Код

procedure TForm1.HTTPGet1DoneString(Sender: TObject; Result: String);

вообще не срабатывает...... срабатывает процедура
Код

procedure THTTPGet.ThreadDone(Sender: TObject); 
begin 
  FResult := FThread.FTResult; 
  if FResult then 
   if FThread.FTToFile then 
    if Assigned(FDoneFile) then FDoneFile(Self, FThread.FTFileName, FThread.FTFileSize) else 
   else 
    if Assigned(FDoneString) then FDoneString(Self, FThread.FTStringResult) else 
  else 
   if Assigned(FError) then FError(Self); 
  FThread := nil; 
end;

но FTResult всегда у меня получается false... поэтому событие не происходит... ищю глюк...
Добавлено @ 22:18
упёрся пока в процедуре
procedure THTTPGetThread.Execute;
на строчке:
Код
...
SetLength(FTStringResult, BytesReaded); 
        FTResult := BytesReaded <> 0; 
       end;

BytesReaded у меня = 0
поэтому и FTResult всегда false

Автор: Albinos_x 14.1.2006, 22:27
ничего понять не могу....
BytesReaded будет больше нуля только при указании файла... как понимаю:
Код
...
if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then Break 
        else 
         if BytesToRead = 0 then Break 
         else 
          begin 
           if FTToFile then 
            BlockWrite(f, Data, BytesToRead) 
           else 
            begin 
             TempStr := Data; 
             SetLength(TempStr, BytesToRead); 
             FTStringResult := FTStringResult + TempStr; 
            end; 

           inc(BytesReaded, BytesToRead); 
           if Assigned(FTProgress) then 
            Synchronize(UpdateProgress); 
          end; 
       end
...

Добавлено @ 22:34
Borland_Delphi_6
если у тебя всё нормально, то попробуй так:
Код

HTTPGet.URL:=URL; 
HTTPGEt.GetString; 
Application.ProcessMessages;
ShowMessage(Txt); 

Автор: Borland_Delphi_6 14.1.2006, 23:29
У меня-то все работает нормально, текст записывает в переменную на ура, но не во время, т.е. происходит то, что описанно выше. "Application.ProcessMessages; " не помогает smile

Автор: Albinos_x 15.1.2006, 00:11
Цитата(Borland_Delphi_6 @ 14.1.2006, 23:29 Найти цитируемый пост)

У меня-то все работает нормально, текст записывает в переменную на ура, но не во время, т.е. происходит то, что описанно выше. "Application.ProcessMessages; " не помогает

мда... сообщение не сразу приходит.... а вот так:
Код

var
  Form1: TForm1;
  Txt:String;
  b:boolean = true;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
HTTPGet1.URL:='http://localhost/';
HTTPGet1.GetString;
while b do
   Application.ProcessMessages;
ShowMessage(Txt); 
b:=true;
end;

procedure TForm1.HTTPGet1DoneString(Sender: TObject; Result: String);
begin
Txt:=Result; //Ýòà ÷àñòü êîäà âûïîëíÿåòñÿ óæå ïîñëå ShowMessage; Ýòî ïîêàçûâàåò è ïðàêòèêà è F8.
b:=false;
end;

у меня не прокатывает...т.к. у меня событие вообще не происходит... но процедура отвечающая за его запуск выполняется до ShowMessage(Txt); при таком варианте.... правда происходит задержка где-то на 1 секунду...

Автор: Borland_Delphi_6 15.1.2006, 12:33
О! Вроде бы все работает! Задержка вроде тоже есть, но маленькая и не критичная! Спасибо!

Автор: Albinos_x 15.1.2006, 17:25
Цитата(Borland_Delphi_6 @ 15.1.2006, 12:33 Найти цитируемый пост)

О! Вроде бы все работает! Задержка вроде тоже есть, но маленькая и не критичная! Спасибо!

был рад помоч smile
не знаю может ты уже это предусмотрел, но вот я тут подумал, что было бы неплохо предусмотреть здесь:
Код

while b do    
   Application.ProcessMessages;

вариант, на случай ошибки, если событие не произошло, допустим спустя несколько секунд, то завершить процедуру...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)