Einzelnen Beitrag anzeigen

easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Timer bei fsSTAYONTOP kommt nicht durch

  Alt 28. Jun 2006, 14:43
So, in dieser Lösung übergebe ich dem Zusatzformular die Rechenroutine. Das Formular erzeugt einen Thread, führt in diesem Thread die Rechenroutine aus und zeigt ein "Lebenszeichen" an
Delphi-Quellcode:
type
  TMsgProcedure = procedure of object;

  TMsgThread = class(TThread)
    private
    protected
      Working : Boolean;
      procedure Execute; override;
    public
      ExecProc : TMsgProcedure;
    end;

  TFormWorkMessage = class(TForm)
    LabelMsgText: TLabel;
    Label1: TLabel;
    Image1: TImage;
    ImageList1: TImageList;
    Timer1: TTimer;
  private
    { Private-Deklarationen }
    ImgIndex : Integer;
    MyThread : TMsgThread;
  public
    { Public-Deklarationen }
    procedure ShowMessageAndExec(MsgText:String;ExecProc:TMsgProcedure);
  end;

var
  FormWorkMessage: TFormWorkMessage;

implementation

{$R *.dfm}

{ TFormWorkMessage }

procedure TMsgThread.Execute;
begin
  Working:=TRUE;
  Self.ExecProc;
  Working:=FALSE;
end;

procedure TFormWorkMessage.ShowMessageAndExec(MsgText: String;
  ExecProc:TMsgProcedure);
begin
  ImgIndex:=1;
  LabelMsgText.Caption:=MsgText;
  // Thread für die Rechenoperation initialisieren
  MyThread:=TMsgThread.Create(TRUE);
  MyThread.ExecProc:=ExecProc;
  MyThread.Resume;
  Self.Show;
  // "lebenszeichen" Anzeigen und warten bis der Thread fertig ist
  repeat
    ImageList1.GetBitmap(ImgIndex,Image1.Picture.Bitmap);
    if ImgIndex<ImageList1.Count-1 then
      Inc(ImgIndex)
    else ImgIndex:=0;
    Self.Repaint;
    Sleep(250);
  until not MyThread.Working;
  // ordnungsgemäß beenden
  MyThread.Terminate;
  MyThread.WaitFor;
  MyThread.Free;
  Self.Close;
end;
Meinungen?
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat