Avatar billede fatter_keine Nybegynder
21. juni 2004 - 00:42 Der 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"

Nogle idéer til hvordan dette kan laves ?
Avatar billede borrisholt Novice
21. juni 2004 - 12:58 #1
Avatar billede hrc Mester
21. juni 2004 - 13:11 #2
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...
Avatar billede fatter_keine Nybegynder
21. juni 2004 - 17:08 #3
Det den skal gøre er:

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...
Avatar billede hrc Mester
22. juni 2004 - 09:06 #4
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;

procedure Tform1.OnCreate(Sender : TObject);
begin
  fButtonList := TStringList.Create;
  AddToStringList(fButtonList);
  fIndex := 0;
end;

procedure Tform1.OnDestroy(Sender : TObject);
begin
  fButtonList.Free;
end;
Avatar billede borrisholt Novice
22. juni 2004 - 09:25 #5
Download eksemplet igen !
Avatar billede hrc Mester
22. juni 2004 - 13:55 #6
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.

type
  TfrmMain = class(TForm)
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    Memo1: TMemo;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
  private
    fButtonList : TStringList;
    fIndex : integer;
    procedure AddToStringList(aStrings : TStrings);
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  fButtonList := TStringList.Create;
  AddToStringList(fButtonList);
  fIndex := 0;

  Timer1.Enabled := true;
end;

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;

procedure TfrmMain.TrackBar1Change(Sender: TObject);
begin
  Timer1.Enabled := false;
  try
    Timer1.Interval := TrackBar1.Position * 1000;
  finally
    Timer1.Enabled := false;
  end; // try
end;
Avatar billede borrisholt Novice
23. juni 2004 - 07:58 #7
fatter_keine>> Sover du ?

Jens B
Avatar billede borrisholt Novice
26. juni 2004 - 17:59 #8
fatter_keine>> når bare man synker i jorden i flere dage er der ingen der gidder besvare dine spm

Jens B
Avatar billede hrc Mester
29. juni 2004 - 09:06 #9
fatter er vist blevet en smule træt, eller hvad?
Avatar billede fatter_keine Nybegynder
04. juli 2004 - 15:25 #10
Jeg er på ferie indtil d. 18 Juli... er ikke så meget på internettet, som jeg havde forventet i denne periode... jeg beklager
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester