Перейти к содержанию

Рекомендуемые сообщения

Я хочу сделать так , чтобы при нажатии на одну кнопку изменялось название формы на "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.
Изменено пользователем NullAlex
Ссылка на комментарий
Поделиться на другие сайты

Поможет кто?

Держи, полностью рабочий код. И нет необходимости два потока создавать.

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.
Ссылка на комментарий
Поделиться на другие сайты

Держи, полностью рабочий код. И нет необходимости два потока создавать.

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.
Ссылка на комментарий
Поделиться на другие сайты

Держи, полностью рабочий код. И нет необходимости два потока создавать.

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.
Ссылка на комментарий
Поделиться на другие сайты

А эта строчка?

 

procedure TMyThread.Execute;

begin

   Synchronize(UpdateCaption);

end;

Почитай о об этом методе. Для смены заголовка формы - синхронизация никак не нужна. Просто нечего синхронизировать - поток отработал, и уничтожился.
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.