Wie Name eines Objekts durchzählen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Wie Name eines Objekts durchzählen

Beitrag von Varus »

Hallo zusammen,
ich habe 8 Memos deren Inhalt ich nach einander auf zb. 'A' überprüfen möchte. Wenn das der Fall ist soll irgendetwas passieren.
Das überprüfen ist nun kein Problem, lediglich weiß ich nicht wie das in Kurzform programmieren kann:

Code: Alles auswählen

 
begin
  
      for i:=0 to memo1.Lines.count-1 and
       do
           if memo1.Lines.Strings[i]='A' then
              begin
              MaleAE((AbstdB*5)+(AbstdB div 2)+10);
              MaleAE((AbstdB*17)+(AbstdB div 2)+35);
              end;
 
      for i:=0 to memo2.Lines.count-1 and
       do
           if memo2.Lines.Strings[i]='A' then
              begin
              MaleAE((AbstdB*5)+(AbstdB div 2)+10);
              MaleAE((AbstdB*17)+(AbstdB div 2)+35);
              end;
 
     ...
 
end;                                       
 
Ich stehe etwas auf dem Schlauch und brauche einen Denkanstoß, ich selber habe folgende Idee gehabt:

Code: Alles auswählen

 
 
 for k:=1 to 8
     do
       memo1.name:='memo' + IntToStr(k);
 
     for i:=0 to memo1.Lines.count-1
       do
           if memo1.Lines.Strings[i]='A' then
              begin
              MaleAE((AbstdB*5)+(AbstdB div 2)+10);
              MaleAE((AbstdB*17)+(AbstdB div 2)+35);
              end;                                     
 
Das würde Theoretisch funktionieren, er kanns Compilieren aber mault dann beim Start direkt "Memo2 already exist".

Ich hoffe Ihr könnt mir helfen!
Danke,
gruß Varus
Zuletzt geändert von Varus am Mi 5. Mär 2014, 13:12, insgesamt 1-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wie Name eines Objekts durchzählen

Beitrag von m.fuchs »

Was du in deinem Codeschnipsel machst, ist auch nicht das was du möchtest. Du benennst Memo1 nur um und würdest also acht Mal diese Memo1 durchsuchen, wenn es nicht schon ein Memo mit Namen Memo2 gäbe.

Wie du an alle Memo-Controls eines Forms herankommst, zeigt dir folgendes Beispiel:

Code: Alles auswählen

procedure ChangeAllMemos;
var
  m: TMemo;
  i: Integer;
begin
  for i := 0 to Form1.ControlCount - 1 do begin
    if Form1.Controls[i] is TMemo then begin
      m := TMemo(Form1.Controls[i]);
      m.Text := 'Blaaaaa';
    end;
  end;
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie Name eines Objekts durchzählen

Beitrag von theo »

Varus hat geschrieben:Hallo zusammen,
und zwar habe ich 8 Memos
Mal eine ganz andere Frage: Ist das jetzt offizielles Deutsch, dass man Sätze mit "und zwar" beginnt?
Ich habe das schon mehrfach gelesen. Irgendwie meckert mein Sprachgefühl da immer und zwar heftig. :wink:
Muss man sich daran gewöhnen?

Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Re: Wie Name eines Objekts durchzählen

Beitrag von Varus »

Varus hat geschrieben:Hallo zusammen,
ich habe 8 Memos deren Inhalt ich nach einander auf zb. 'A' überprüfen möchte. Wenn das der Fall ist soll irgendetwas passieren.
So besser!? Sorry, hast recht. Is bisschen unschön :lol:

Gibt es noch eine andere Möglichkeit? Die Befehle sind mir bisschen "fremd" und für mich, sagen wir mal anfängerunfreundlich :roll:

Gruß Varus

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Wie Name eines Objekts durchzählen

Beitrag von Christian »

for i := 1 to 10 do
FindControl('Memo1'+IntToStr(i)).Text := 'Blahh';
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wie Name eines Objekts durchzählen

Beitrag von m.fuchs »

Varus hat geschrieben:Gibt es noch eine andere Möglichkeit? Die Befehle sind mir bisschen "fremd" und für mich, sagen wir mal anfängerunfreundlich :roll:
Ja, du kannst zum Beispiel dir ein array of TMemo anlegen und im OnCreate des Forms da alle Memos reinpacken. Dann kannst du da immer durchgehen. Ob das jetzt unkomplizierter ist als die sechs Zeilen da oben?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Re: Wie Name eines Objekts durchzählen

Beitrag von Varus »

Hallo nochmal!

Nun habe ich mich ein wenig mit dem erstellen und einlesen von Arrays vertraut gemacht und möchte das gerne mit Arrays lösen (das ist ne Arbeit für die Uni und wird nach einsatz verschiedener Elemente und Eleganz bewertet). Nochmal kurz zur Darstellung des Problems:
Ich habe 8 Memos in die Musiknoten eingetragen werden bis jeweils max. 7 Zeilen (kann auch weniger Zeilen enthalten). Die Noten werden vom Benutzer im Programmablauf "eingetragen", dh. es sind nicht immer alle Memos gefüllt. Und wenn nun in einer dieser Memos(1 bis 8 ) z.B. die Note A (oder A#, können bis zu 2 Zeichen sein) erscheint soll etwas gemalt werden. Äquivalent soll natürlich die Funktion für alle Möglichen Noten zur Verfügung stehen.
Ich habe nun folgenden Quelltext:

Code: Alles auswählen

 
procedure TForm1.drawTimer(Sender: TObject);
 
Var
 AbstdB,Bnd,anzB                            :Integer; //Werte zum späteren berechnen und einzeichnen
 i                                                   :Integer;
 MemoAry                                       :Array[1..8, 1..7] of String; //Mein Konstantes Array
 T                                                  :String; //Variable für die gesuchte Note
 
 
const
  Toene1 =1;                        
  Toene2 =2;
  Toene3 =3;
  Toene4 =4;
  Toene5 =5;
  Toene6 =6;
  Toene7 =7;
  Toene8 =8;
 
begin
    Bnd:=40;
    anzB:=25;
    AbstdB:=(image1.Width-Bnd)div(anzB);
    T:='A';  //Hier das gesuchte Zeichen, bzw. String, da es Halbtonschritte gibt könnte es auch A# sein
 
    for i:=1 to 7 do  //Hier das eintragen der Daten ins Array, jeweils 7 Zeilen pro Memo 
        begin
          MemoAry[Toene1 ,i]:=memo1.lines[i];
          MemoAry[Toene2 ,i]:=memo2.lines[i];
          MemoAry[Toene3 ,i]:=memo3.lines[i];
          MemoAry[Toene4 ,i]:=memo4.lines[i];
          MemoAry[Toene5 ,i]:=memo5.lines[i];
          MemoAry[Toene6 ,i]:=memo6.lines[i];
          MemoAry[Toene7 ,i]:=memo7.lines[i];
          MemoAry[Toene8 ,i]:=memo8.lines[i];
        end;
 
     for i:=1 to 7 do     //Da ich weiß wie ich ein Memo nach einem String durchsuchen kann erschien mir das als einfache Lösung, 
                                //allerdings funktioniert das nicht, da es ein Procedure eines Timers ist ist es zu schnell für die Anzeige
 
         Memo9.lines.add(MemoAry[Toene1 ,i]);
         Memo9.lines.add(MemoAry[Toene2 ,i]);
         Memo9.lines.add(MemoAry[Toene3 ,i]);
         Memo9.lines.add(MemoAry[Toene4 ,i]);
         Memo9.lines.add(MemoAry[Toene5 ,i]);
         Memo9.lines.add(MemoAry[Toene6 ,i]);
         Memo9.lines.add(MemoAry[Toene7 ,i]);
         Memo9.lines.add(MemoAry[Toene8 ,i]);
 
 
 
     if ('A' in MemoAry[1..8, 1..7]) then    //Hier würde ich das Memo9 durchsuchen oder aber nach einer eleganten
                                                            // Lösung das MemoAry nach dem String 'A' bzw Platzhalter T durchsuchen
                                                             //So sagt er folgende Fehlermedlung: "Operator is not overload"
 
     if MemoAry[1..8, 1..7] = T                //Eine weitere Idee aber funktioniert auch nicht:
                                                            // "Operator is not overload: Array... of Array... ofAnsiString" = "AnsiString"
 
                begin
                  MaleAE((AbstdB*5)+(AbstdB div 2)+10);
                  MaleAE((AbstdB*17)+(AbstdB div 2)+35);
                end;
 
 
end;                                                  
 
 
Ich denke das könnte so funktionieren, allerdings hängt es bei dem Befehl für die Durchsuche des Arrays nach dem entsprechenden String/Note. Ich finde keinen Befehl mit dem ich das Array einfach nach einem String durchsuchen kann. Wie muss ich das angehen? Was denkt ihr, oder ist die Lösung mit dem Array schwachsinn? Ich weiß es ist nun ein etwas längerer Quelltext und würde mit einer voherigen Lösung wahrscheinlich einfacher sein, aber die Vorgehensweise verstehe ich nun und denke es passt auch zu meinem Anwendungsfall.

Ich danke euch für eure Hilfe!
Gruß Varus

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie Name eines Objekts durchzählen

Beitrag von theo »

Ich verstehe überhaupt nicht was du da machst mit diesen Arrays.

Mach doch einfach eine Funktion, der du dann alle Memo.Lines übergibst:

Z.B.

Code: Alles auswählen

 
function Myfunc(Stri:TStrings):Boolean; (oder was du brauchst)
begin
 Machwas mit den TStrings.
end;
 
if Myfunc(Memo1.Lines) then...
if Myfunc(Memo2.Lines) then...
etc.
Und ein bisschen lesen. Es wurde dir schon mal der Link auf Delphi-Treff gegeben.
http://www.delphi-treff.de/tutorials/ob ... unktionen/

Antworten