21. juni 2004 - 00:42Der er
8 kommentarer og 2 løsninger
læs fra memo
Jeg skal lave en stump kode der skal kunne trykke på nogle knapper i min applikation, hvilke knapper bestemmes udfra hvad der står i en memo
et eks. med 4 knapper:
1,0,1,0;0,1,0,1;1,0,1,0;1,0,1,0 osv...
1 er tændt og 0 er slukket...
"," betyder næste knap og ";" betyder forfra
Således at knapperne bliver skiftevis aktiveret 2 og 2...
";" angiver at man hopper tilbage til knap 1, og denne funktion bliver tidsbestemt af en "Track.position" således at alle knapper sat til "1" bliver trykket på nærmest samtidig, og når ";" så kommer skal der gå et vist antal sekunder før næste "knap-trykning"
Du har noget med knapper der en- og disables efter et timerinterval, eller hvad?
Når du skriver "";" angiver at man hopper tilbage til knap 1" så betyder det, at du starter forfra for den pågældende knap, ikke?
Først ville jeg splitte knapperne op i en TStringList (antager at den kaldes med en privat TStringList ved navn fButtonList):
procedure TForm1.AddToStringList(aStrings : TStrings); var p : integer; st : string; begin aStrings.Clear;
st := Memo1.Lines.Text;
// Fjern kommaerne da de jo er overflødige repeat p := pos(',',st); if p > 0 then delete(st,p,1); until p = 0;
// Gennemløb streng while st <> '' do begin p := pos(';',st); if p = 0 then // Ikke flere knapper aStrings.Add(st) else begin aStrings.Add(copy(st,1,p-1); delete(st,1,p); end;
// Hægter de tilhørende knapper på de respektive linier case aStrings.Count of 1 : aStrings.Objects[aStrings.Count - 1] := TObject(Button1); 2 : aStrings.Objects[aStrings.Count - 1] := TObject(Button2); 3 : aStrings.Objects[aStrings.Count - 1] := TObject(Button3); 4 : aStrings.Objects[aStrings.Count - 1] := TObject(Button4); 5 : aStrings.Objects[aStrings.Count - 1] := TObject(Button5); end; end; // while end;
Nu har du knapper og kontrolstrenge koblet sammen i en TStringList. Dernæst skal du løbe gennem kontrolstrengen efter et givet interval. Bruger TButton.Tag til at gemme positionen:
procedure TForm1.OnTimerEvent(sender : TObject); var i : integer; CtrlStr : string; Button : TButton; begin // fButtonList er listen som AddToStringList blev kaldt med for i := 0 to fButtonList.Count - 1 do begin CtrlStr := fButtonList[i]; Button := TButton(fButtonList.Objects[i]); // Find pågældende knap
// Tæl Tag op, justér hvis større end længden på strengen Button.Tag := (succ(Button.Tag) mod length(CtrlStr)) + 1;
// Sæt knappen afhængig af hvad der står i strengen ('0101101') Button.Enabled := boolean(CtrlStr[Button.Tag]); end; end;
Hvis jeg har skudt helt ved siden af, så beklager jeg, men det var da i det mindste en sjov lille idé at nørde med. Jeg ville selv nok have lavet specialiserede klasser i stedet, men det gider jeg først hvis du ber' om dem...
med 0101;1010;0101;1010 i memoen skal den først klikke på knap 2 og 4.... så vente et tidsinterval hentet fra track.position, dernæst klikke på knap 1 og 3 osv...
Kan ikke helt gennemskue dit, hrc.... og Borrisholt> Dit program sætter noget ind i en memo?... det er ikke mit formål ligenu...
Nå men, så er det jo næsten hvad mit eksempel gør. Heldigvis kan jeg fjerne de 2 hacks i den justerede version nedenfor, i forhold til den ovenfor, hvor hver linie i strenglisten var tilknyttet en knap.
procedure TForm1.AddToStringList(aStrings : TStrings); var i : integer; st : string; begin aStrings.Clear;
st := Memo1.Lines.Text;
// Fjern kommaerne da de er overflødige i := length(st); while i > 0 do begin if st[i] = ',' then delete(st,i,1); dec(i); end;
// Gennemløb streng while st <> '' do begin p := pos(';',st); if p = 0 then // Ikke flere knapper aStrings.Add(st) else begin aStrings.Add(copy(st,1,p-1); delete(st,1,p); end; end; // while end;
// En TTimer banker denne her afsted med jævne mellemrum procedure TForm1.OnTimerEvent(sender : TObject); var i : integer; CtrlStr : string; Button : TButton; begin // fButtonList er listen som AddToStringList blev kaldt med (placeret i den // private sektion af TForm1 (derfor det foranstillede f)) // fIndex er en integer placeret samme sted
CtrlStr := fButtonList[fIndex]; for i := 1 to length(CtrlStr) do case i of 1 : Button1.Enabled := CtrlStr[i] = '1'; 2 : Button2.Enabled := CtrlStr[i] = '1'; 3 : Button3.Enabled := CtrlStr[i] = '1'; 4 : Button4.Enabled := CtrlStr[i] = '1'; end;
// Tæl Index op, justér hvis større end længden på strengen fIndex := (succ(fIndex) mod length(CtrlStr)) + 1; end;
Ja, ja - den er ved at være det, tror jeg. Nu har jeg endelig taget mig tid til at prøve at få det til at køre i Delphi. Brugte TSpeedButtons da jeg legede lidt med dens .Down property, men brug du bare TButton hvis du synes.
I formens definition kan du se de komponenter jeg har brugt.
procedure TfrmMain.FormDestroy(Sender: TObject); begin fButtonList.Free; end;
procedure TfrmMain.AddToStringList(aStrings: TStrings); var i, p : integer; st : string; begin aStrings.Clear;
st := Memo1.Lines.Text;
// Fjern kommaerne da de er overflødige i := length(st); while i > 0 do begin if st[i] in [#13,#10,','] then delete(st,i,1); dec(i); end;
// Gennemløb streng while st <> '' do begin p := pos(';',st); if p = 0 then begin // Ikke flere knapper aStrings.Add(st); st := ''; end else begin aStrings.Add(copy(st,1,p-1)); delete(st,1,p); end; end; // while end;
// En TTimer banker denne her afsted med jævne mellemrum procedure TfrmMain.Timer1Timer(Sender: TObject); var i : integer; CtrlStr : string; SpeedButton : TSpeedButton; begin CtrlStr := fButtonList[fIndex]; for i := 1 to length(CtrlStr) do begin case i of 1 : SpeedButton := SpeedButton1; 2 : SpeedButton := SpeedButton2; 3 : SpeedButton := SpeedButton3; 4 : SpeedButton := SpeedButton4; end; SpeedButton.Caption := CtrlStr[i];; SpeedButton.Click; end;
// Tæl Index op, justér hvis større end længden på strengen fIndex := (succ(fIndex) mod length(CtrlStr)); end;
Jeg er på ferie indtil d. 18 Juli... er ikke så meget på internettet, som jeg havde forventet i denne periode... jeg beklager
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.