Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Вниз

Странное поведение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
15-1259875013
AlexDan
2009-12-04 00:16
2010.02.07
Стиль W7 и стандартные компоненты..


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


3-1234422961
dolmat
2009-02-12 10:16
2010.02.07
как создать триггер


15-1259930302
@!!ex
2009-12-04 15:38
2010.02.07
Есть спецы в программирования для Win Mobile?


2-1259683014
Evgnevius
2009-12-01 18:56
2010.02.07
Вывода битмапа по маске и под углом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский