Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

Странное поведение Delphi 2009   Найти похожие ветки 

 
EgorovAlex ©   (2009-03-11 10:33) [0]

Есть такой код:
В нём выскакивает исключение, когда выполняется процедура SetStr, почему оно возникает? В предыдущих версиях дельфы такого не наблюдал:


type
 TProcTest = procedure(const TestStr: string) of object;

 TTestThread = class(TThread)
 private
   ProcTest: TProcTest;
 protected
   procedure Execute; override;
 end;

procedure TTestThread.Execute;
var
 S: string;

 procedure SetStr(I: Integer);
 begin
   S := "Ok " + IntToStr(I); // вод здесь в строку данные не попадают!
 end;

var
 I: Integer;
begin
 for I := 0 to 9 do begin
   SetStr(I);
   Synchronize(procedure begin
     ProcTest(S);
   end);
 end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 with TTestThread.Create(True) do begin
   ProcTest := Self.ProcTest;
   FreeOnTerminate := True;
   Resume;
 end;
end;

procedure TForm2.ProcTest(const TestStr: string);
begin
 Memo1.Lines.Add(TestStr);
end;


 
Palladin ©   (2009-03-11 10:40) [1]

А в предыдущих версиях делфи не было анонимных процедур :), в связи с этим, вызов

Synchronize(procedure begin ProcTest(S); end)

мне кажется очень сомнительным


 
EgorovAlex ©   (2009-03-11 10:43) [2]

Так даже если закомментировать этот код, исключение всё-равно будет, а приведённый код синхронизации рекомендуется кодегировцами, как рабочий :)


 
EgorovAlex ©   (2009-03-11 10:45) [3]

Прошу прощения за дезинформацию- если код синхронизации закомментить, то исключения не возникает!


 
EgorovAlex ©   (2009-03-11 10:47) [4]

Да, если работать по-старому, без анонимных процедур, то проблем нет :( это похоже их баг :(


 
Palladin ©   (2009-03-11 10:50) [5]


> EgorovAlex ©   (11.03.09 10:47) [4]

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


 
Palladin ©   (2009-03-11 10:53) [6]

а вот так нельзя написать?

Synchronize(procedure of self begin
    ProcTest(S);
  end);

:)


 
EgorovAlex ©   (2009-03-11 10:54) [7]

Так в 2009 Synchronize переписан, от теперь и регулярные процедуры может принимать, вопрос только как качественно это сделали.

У кого есть логин на CDN - можете запостить этот баг?


 
EgorovAlex ©   (2009-03-11 10:56) [8]

> Synchronize(procedure of self begin
>   ProcTest(S);
> end);

Нет, так нельзя



Страницы: 1 вся ветка

Текущий архив: 2010.02.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1260504031
KASioZ
2009-12-11 07:00
2010.02.07
TWebBrowser DOM


15-1259789646
AlexDan
2009-12-03 00:34
2010.02.07
Переходить ли на W7.. продолжение..


2-1260457480
RWolf
2009-12-10 18:04
2010.02.07
Exit из except-скобок


15-1259997701
begin_flasher
2009-12-05 10:21
2010.02.07
Shockwave Flash


2-1260371106
Timur&Co
2009-12-09 18:05
2010.02.07
Прозрачность TListView