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
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