Главная страница
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.012 c
2-1260708366
JohnKorsh
2009-12-13 15:46
2010.02.07
Вопрос по беспроводным сетям.


15-1259877728
kyn66
2009-12-04 01:02
2010.02.07
Странно ветка исчезла.


2-1260534328
Alexxx
2009-12-11 15:25
2010.02.07
FontDialog


4-1228802818
DimonS
2008-12-09 09:06
2010.02.07
Как реализовать чтение iButton?


2-1260456442
Proxytel
2009-12-10 17:47
2010.02.07
Как читать индикатор чтения-записи жесткого диска?