| Autor |
Beitrag |
Sylvus
      
Beiträge: 195
|
Verfasst: So 23.08.09 20:54
Hay Leute, ich hab ziemlich viel Code...dieser muss mehrmals ausgeführt werden.
Beim ersten Durchgang sehen die Sachen unegfähr so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| with abc do begin lalala.acb[1]:=I+K; lalala.acb[5]:=I+K; lalala.acb[4]:=I+K; lalala.acb[44]:=I+K; end; |
beim zweiten dann so
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| with DEF do begin lalala.acb[1]:=I+K; lalala.acb[5]:=I+K; lalala.acb[4]:=I+K; lalala.acb[44]:=I+K; end; |
Jetzt wollte ich das gerne zusammenfassen, aber ich kann den Bezeichner, der nach with kommt nicht als string deklarieren, sonst würd ich da ja eine variable hinsetzten und die bei jedem Durchgang ändern!
Jetzt hatte ich soetwas überlegt:
Delphi-Quelltext 1: 2: 3: 4:
| if I=1 then with Linien.LinienHorizontal1 do else with Linien.LinienHorizontal2 do |
aber das geht natürlich nicht
Meine Frage, wie mach ich das jetzt am elegantesten, also auch mit wenig ressources, da das große ganze nen paar 1000x durchläuft... DANKE
Grüße Sylvus
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 23.08.09 21:29
Lass einfach das dämliche with weg und nimm ganz normal eine Zwischenvariable.
Aber genauso (mit Variable) geht es mit dem with auch. Aber da müsstest du schon sagen was da genau nicht funktioniert, sonst kann ich dazu nicht mehr sagen, normalerweise geht das problemlos. 
|
|
Sylvus 
      
Beiträge: 195
|
Verfasst: So 23.08.09 22:12
naja also ich hab ne Klasse und die will ich ja nicht immer mit davor schreiben!
Also wenn ich jetzt schreibe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var a:string;
a:=MeineZuweisung1.Bla
with a do begin
...
end; |
dann geht das nicht, weil a ein String ist  Auf was müsste ich a da jetzt ändern?
Und ohne das with? Wie soll das gehen
Grüße Sylvus
//P.S.
Fehlermeldung sagt eigentlich alles:
[DCC Fehler] Unit2.pas(90): E2018 Record, Objekt oder Klassentyp erforderlich
also als was deklarier ich jetzt die variable?
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 23.08.09 22:16
Wenn es z.B. um ein Edit geht (du hättest ja einfach den konkreten Quelltext posten können...): Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var MyEdit: TEdit; begin MyEdit := Edit1; with MyEdit do begin Text := '...'; end; | Oder direkt: Delphi-Quelltext 1: 2: 3: 4: 5:
| var MyEdit: TEdit; begin MyEdit := Edit1; MyEdit.Text := '...'; | Oder als Prozedur: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure DoSomething(MyEdit: TEdit); begin MyEdit.Text := '...'; end;
DoSomething(Edit1); DoSomething(Edit2); ... | Dass im with kein String oder so stehen kann, ist ja klar, weil es ja dabei gerade darum geht auf eine Eigenschaft / Feld des angegebenen Objekts / Records zuzugreifen.
|
|
Sylvus 
      
Beiträge: 195
|
Verfasst: So 23.08.09 22:19
Naja Code ist nicht sauber aber ok:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| temp:=Linien.LinienHorizontal1; for I := 1 to 2 do begin with temp do begin if (current = Linien13[1]) or (current = Linien13[2]) or (current = Linien13[3]) then begin if Fertig1 then Fertig1 := Pruefe(Linien13, I, current); end; if (current = Linien14[1]) or (current = Linien14[2]) or (current = Linien14[3]) or (current = Linien14[4]) then begin if Fertig1 then Fertig1 := Pruefe(Linien14, I, current); end; if (current = Linien15[1]) or (current = Linien15[2]) or (current = Linien15[3]) or (current = Linien15[4])or (current = Linien15[5])then begin if Fertig1 then Fertig1 := Pruefe(Linien15, I, current); end; if (current = Linien24[1]) or (current = Linien24[2]) or (current = Linien24[3]) or (current = Linien24[4])then begin if Fertig1 then Fertig1 := Pruefe(Linien24, I, current); end; if (current = Linien23[1]) or (current = Linien23[2]) or (current = Linien23[3]) then begin if Fertig1 then Fertig1 := Pruefe(Linien23, I, current); end; end; temp:=Linien.LinienHorizontal2; end; |
Der geht aber nicht  Außerdem hier noch die deklaration von dem ganzen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type SubLinien = record public Linien13: array[1..3] of Integer; Linien23: array[1..3] of Integer; Linien14: array[1..4] of Integer; Linien24: array[1..4] of Integer; Linien15: array[1..5] of Integer; end;
MainLinien = record public LinienVertical: SubLinien; LinienHorizontal1: SubLinien; LinienHorizontal2: SubLinien; end; |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 23.08.09 22:27
Und temp ist als SubLinien deklariert? Da es sich leider um Records statt Klassen handelt, müsstest du da Pointer benutzen um auf den jeweiligen Record selbst zuzugreifen statt auf eine Kopie davon.
Ganz wichtig: Du solltest dich an Konventionen halten. So ist der Quelltext für Fremde kaum lesbar, weil du Typen ohne das führende T schreibst. TSubLinien und TMainLinien meine ich, denn an dem T sieht man sofort, dass es ein Typ und kein Feld oder Variable oder so ist.
|
|
Sylvus 
      
Beiträge: 195
|
Verfasst: So 23.08.09 22:35
ja ok werd ich ändern
Und zu temp, wie mach ich das jetzt, im Moment ist temp als string deklariert, aber das geht ja nicht  Vielleicht ne kurze Hilfestellung, Pointer... und weiter
Grüße Sylvus
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 23.08.09 22:39
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TSubLinien = record public Linien13: array[1..3] of Integer; end; PSubLinien = ^TSubLinien;
...
var temp: PSubLinien; begin temp := @Linien.LinienHorizontal1; with temp^ do ... | Was passiert:
Du legst in temp nur einen Zeiger auf deinen Record und greifst dann auf den Record hinter dem Pointer zu.
Das alles könntest du dir sparen, wenn du Klassen benutzt, denn das sind bereits intern Pointer ohne dass du dich darum kümmern musst.
|
|
Sylvus 
      
Beiträge: 195
|
Verfasst: So 23.08.09 22:51
Super danke, geht soweit
Ich hab das ganze System jetzt schon von einzlenen Arrays zu records übertragen  Aber ich denke wenn ich wieder Zeit habe, werd ich das mal mit klassen probieren
Danke dir!
Grüße Sylvus
|
|
|