Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MessgaeBox und ShowMessage ist riesig (https://www.delphipraxis.net/83476-messgaebox-und-showmessage-ist-riesig.html)

alf.stefan 3. Jan 2007 12:57


MessgaeBox und ShowMessage ist riesig
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen

ich habe von Konrad Elektronic ein usb Experimental board von velleman
und habe da eine Oberfläche programmiert mit der man eine Schrittkette ablaufen lassen kann.

Dabei werden Eingänge oder Timeouts in einem eigenen Threat gepollt und dann über eine Action list als Ergebnis in der Application mit TAction.Execute ein Event ausgelöst.

Das hat soweit prima geklappt.

Nun wollte ich auch noch ein Programmaufruf zur Auswertung einbinden.

die Klasse sieht so aus


Delphi-Quellcode:
unit Chain;

interface
uses Classes, iniFiles, sysUtils;
type TChainStep = class(TObject)
    actString: String;
    outputToSet : byte;
    msToWait: integer;
    inputToWait : smallInt;
    nextStepDann : shortInt;
    nextStepSonst: shortInt;
    next : shortInt;
    callRoutine : string;
end;
type TChain = class(tObject)
  count : word;
  curStep : smallInt;
  curIStat : byte;
  step : Array of TChainStep;
  constructor create;
end;
implementation
constructor TChain.create;
var
  ini : TIniFile;
  stepKey : string;
  cur : shortInt;
  stepText : string;
  lastReached:boolean;
  dir : string;
begin
  DecimalSeparator:='.';
  curStep := -1;
  cur:=1;
  dir := extractFileDir(paramStr(0));
  ini := TIniFile.Create(IncludeTrailingPathDelimiter(dir)+'chain.ini');

  try
     lastReached:=false;
     while not lastReached do
     begin
       stepKey := Format('%s%d',['Step',cur]);
       stepText := ini.ReadString(stepKey,'actString','Not Defined');
       if compareStr(stepText,'Not Defined')=0 then
        lastReached:= true
       else
       begin
         setLength(step, cur);
         step[cur-1] := TChainStep.Create;
         step[cur-1].actString := stepText;
         step[cur-1].outputToSet := ini.ReadInteger(stepKey,'outPut',0); // setze output 1
         step[cur-1].msToWait := ini.ReadInteger(stepKey,'msToWait',0);  // warte unendlich
         step[cur-1].inputToWait := ini.ReadInteger(stepKey,'inputToWait',0); // auf input 2
         step[cur-1].nextStepDann:= ini.ReadInteger(stepKey,'nextStepDann',1)-1;// ergebnis gibts im nächsten schritt
         step[cur-1].nextStepSonst :=ini.ReadInteger(stepKey,'nextStepSonst',0)-1;//
         step[cur-1].callRoutine := ini.ReadString(stepKey,'callRoutine','');;
         inc(cur);
       end;
     end;//while
  finally
    ini.Free;
  end;
end;
end.
die Schrittkette ist ein Inifile und im Anhang
bei Step 5 ist eine Callroutine eingetragen die in der Application
Delphi-Quellcode:
...
    AskFor: TAction;
...
deklariert ist.

Wenn jetzt der Schritt mit der callRoutine kommt wird sie so aufgerufen

Delphi-Quellcode:


  if chain.step[actChain.Tag].callRoutine<>'' then
  begin
     foundComponent := FindComponent(chain.step[actChain.Tag].callRoutine);
     Memo1.Lines.Append(foundComponent.Name);
     Memo1.Lines.Append(foundComponent.ClassName);
     TAction(foundComponent).Execute;
     if TAction(foundComponent).Tag = mrYes then
        actChain.Tag := chain.step[actChain.Tag].nextStepDann
     else actChain.Tag := chain.step[actChain.Tag].nextStepSonst;

     Memo1.Lines.Append(chain.step[actChain.Tag].actString);
  end;
wenn jetzt in askFor execute nur ShowMessage aufgerufen wird füllt die Messgaebox den kompletten Bildschirm und alles darüber hinaus! Scrollen bringt nicht das Fenster ist zu groß!

Bei MessgaeBox oder MessageDlg ist es nicht so schlimm aber das Fenster ist unendlich breit und die Buttons sind irgendwo im Nirwana. siehe screenshot

Kann damit jemand was anfangen??
Hat jemand auch so ein board? (dann kann ich ihm/ihr das ganze projekt ja mal zuschicken)

hoffe auf hilfe

Gruß stefan

Bernhard Geyer 3. Jan 2007 13:00

Re: MessgaeBox und ShowMessage ist riesig
 
Kontrollier mal ob lauter Leerzeichen im anzuzeigenden Text sind. Evtl. mal mit Trim entfernen lassen.

alf.stefan 3. Jan 2007 13:06

Re: MessgaeBox und ShowMessage ist riesig
 
hallo bernhard
Das schlimme an der Sache ist, dass dieses überbreite Fenster nur beim ersten Aufruf immer und sonst nur gelegentlich kommt.
d.h. ich bin mir sicher, dass es da keine leerzeichen gibt. Auserdem ist es ein 'händisch' eingetragener Text!

Trotzdem Danke
Gruß
Stefan

alf.stefan 19. Jan 2007 07:01

Re: MessgaeBox und ShowMessage ist riesig
 
Ich hab den Fehler gefunden!!

Es ist das gleiche wie bei meiner Frage: Timage friert ein.

Die TAction ist nicht Threadsicher!! Unschön ist natürlich diese Auswirkung da kommt man nur schwer drauf!

Danke

Gruß Stefan

Luckie 19. Jan 2007 12:31

Re: MessgaeBox und ShowMessage ist riesig
 
Die VCL ist generell nicht threadsicher und das sollte man eigentlich wissen.

alf.stefan 19. Jan 2007 15:33

Re: MessgaeBox und ShowMessage ist riesig
 
Ja sollte man aber,
dass ein nicht beachten solch fatale und/oder sporadische Auswirkungen hat war schon der Hammer.
Und es ist schwer solch einem Fehler auf die Spur zu kommen wenn er sich mal eingeschlichen hat.

Hauptsache ich habe was draus gelernt.

Gruß von

Stefan

Bernhard Geyer 19. Jan 2007 19:24

Re: MessgaeBox und ShowMessage ist riesig
 
Zitat:

Zitat von alf.stefan
dass ein nicht beachten solch fatale und/oder sporadische Auswirkungen hat war schon der Hammer.

Wieso der Hammer? Das sind ja gerade die Auswirkungen der fehlenden Thread-Sicherheit: Es kracht Hin und Wieder ohne das man mit dem Debugger gleich auf die Ursache stößt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz