afro228offical Опубликовано 13 марта, 2015 Поделиться Опубликовано 13 марта, 2015 (изменено) Я хочу сделать так , чтобы при нажатии на одну кнопку изменялось название формы на "1 имя" , а при нажатии на другую название менялось на "2 имя" Но у меня не выходит... P.S. занубил...(NullAlex: теги кода и спойлера зачем существуют?unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TMyThread = class(TThread) private { Private declarations } protected procedure Execute; override; procedure UpdateCaption; procedure qUpdateCaption; end; var Form1: TForm1; MyThread: TMyThread; qMyThread: TMyThread; implementation {$R *.dfm} procedure TMyThread.UpdateCaption;begin Form1.Caption:='2 имя';end; procedure TMyThread.qUpdateCaption;begin Form1.Caption:='1 имя';end; procedure TMyThread.Execute;begin Synchronize(UpdateCaption);end; procedure TForm1.Button1Click(Sender: TObject);begin MyThread:=TMyThread.Create(False); MyThread.Priority:=tpNormal; MyThread.FreeOnTerminate:=true;end; procedure TForm1.Button2Click(Sender: TObject);begin qMyThread:=TMyThread.Create(False); qMyThread.Priority:=tpNormal; qMyThread.FreeOnTerminate:=true;end; end. Изменено 13 марта, 2015 пользователем NullAlex Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 13 марта, 2015 Автор Поделиться Опубликовано 13 марта, 2015 Поможет кто? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 13 марта, 2015 Поделиться Опубликовано 13 марта, 2015 Поможет кто?Держи, полностью рабочий код. И нет необходимости два потока создавать.P.S.Конечно, правильнее было-бы в описании класса потока переменную сделать private, и указать на нее свойство в public, но для примера и так пойдет.unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TMyThread = class(TThread) public sCaption: string; // переменная, принимающая текст, который будет выставлен форме procedure Execute; override; end;var Form1: TForm1; MyThread: TMyThread;implementation{$R *.dfm}procedure TMyThread.Execute;begin Form1.Caption := Self.sCaption;end;procedure TForm1.Button1Click(Sender: TObject);begin MyThread := TMyThread.Create(True); // создаем поток, но не запускаем with MyThread do // означает, что следующий код будет выполняться от имени экземпляра потока begin sCaption := 'Кнопка 1'; // текст заголовка FreeOnTerminate := True; // указываем, чтобы поток уничтожился при завершении Resume; // запускаем поток вручную end;end;procedure TForm1.Button2Click(Sender: TObject);begin MyThread := TMyThread.Create(True); // создаем поток, но не запускаем with MyThread do // означает, что следующий код будет выполняться от имени экземпляра потока begin sCaption := 'Кнопка 2'; // текст заголовка FreeOnTerminate := True; // указываем, чтобы поток уничтожился при завершении Resume; // запускаем поток вручную end;end;end. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 14 марта, 2015 Автор Поделиться Опубликовано 14 марта, 2015 Держи, полностью рабочий код. И нет необходимости два потока создавать.P.S.Конечно, правильнее было-бы в описании класса потока переменную сделать private, и указать на нее свойство в public, но для примера и так пойдет. спсunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TMyThread = class(TThread) public sCaption: string; // переменная, принимающая текст, который будет выставлен форме procedure Execute; override; end;var Form1: TForm1; MyThread: TMyThread;implementation{$R *.dfm}procedure TMyThread.Execute;begin Form1.Caption := Self.sCaption;end;procedure TForm1.Button1Click(Sender: TObject);begin MyThread := TMyThread.Create(True); // создаем поток, но не запускаем with MyThread do // означает, что следующий код будет выполняться от имени экземпляра потока begin sCaption := 'Кнопка 1'; // текст заголовка FreeOnTerminate := True; // указываем, чтобы поток уничтожился при завершении Resume; // запускаем поток вручную end;end;procedure TForm1.Button2Click(Sender: TObject);begin MyThread := TMyThread.Create(True); // создаем поток, но не запускаем with MyThread do // означает, что следующий код будет выполняться от имени экземпляра потока begin sCaption := 'Кнопка 2'; // текст заголовка FreeOnTerminate := True; // указываем, чтобы поток уничтожился при завершении Resume; // запускаем поток вручную end;end;end. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 18 марта, 2015 Автор Поделиться Опубликовано 18 марта, 2015 Попробую сделать мини-калькулятор через потоки... Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 19 марта, 2015 Автор Поделиться Опубликовано 19 марта, 2015 Держи, полностью рабочий код. И нет необходимости два потока создавать.P.S.Конечно, правильнее было-бы в описании класса потока переменную сделать private, и указать на нее свойство в public, но для примера и так пойдет. А эта строчка? procedure TMyThread.Execute;begin Synchronize(UpdateCaption);end;unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TMyThread = class(TThread) public sCaption: string; // переменная, принимающая текст, который будет выставлен форме procedure Execute; override; end;var Form1: TForm1; MyThread: TMyThread;implementation{$R *.dfm}procedure TMyThread.Execute;begin Form1.Caption := Self.sCaption;end;procedure TForm1.Button1Click(Sender: TObject);begin MyThread := TMyThread.Create(True); // создаем поток, но не запускаем with MyThread do // означает, что следующий код будет выполняться от имени экземпляра потока begin sCaption := 'Кнопка 1'; // текст заголовка FreeOnTerminate := True; // указываем, чтобы поток уничтожился при завершении Resume; // запускаем поток вручную end;end;procedure TForm1.Button2Click(Sender: TObject);begin MyThread := TMyThread.Create(True); // создаем поток, но не запускаем with MyThread do // означает, что следующий код будет выполняться от имени экземпляра потока begin sCaption := 'Кнопка 2'; // текст заголовка FreeOnTerminate := True; // указываем, чтобы поток уничтожился при завершении Resume; // запускаем поток вручную end;end;end. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 19 марта, 2015 Поделиться Опубликовано 19 марта, 2015 А эта строчка? procedure TMyThread.Execute; begin Synchronize(UpdateCaption); end;Почитай о об этом методе. Для смены заголовка формы - синхронизация никак не нужна. Просто нечего синхронизировать - поток отработал, и уничтожился. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения