Autor |
Beitrag |
musiktiger
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 06.05.03 13:56
Hallo ihr,
ich weiß der Titel klingt ein bisschen kömisch  , aber ich weiß es nicht anders so kurz zu beschreiben.
Nun die lange Beschreibung:
Ich will einen Array erstellen in dem ich Daten für Kreise, Rechtecke und Trapeze speichern kann.
Also soll der Array nicht immer die gleichen Datentypen enthalten, sondern manchmal einen Record in dem die Kreisdaten (Radius, Mittelpunkt) gespeichert sind oder einen anderen Record, der die Rechteckdaten (Punkte: LinksOben, LinksUnten) enthält.
Hat jemand das verstanden und kann mir da helfen?
Ich wäre super dankbar!
Gruß,
MuTi
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Di 06.05.03 15:04
Klar..habs verstanden.
Ich würd das array mit headern machen...
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TGeoKind = (gkCirc, gkQuad,gkTriangle...); tHeader = record kind : TGeoKind; ptr: Pointer; end;
TGeoArr : array of THeader; |
...in denen die art des records gespeichert ist und einen pointer zu dem tatsächlichen record. Bein erstellen des arrays musst du den speicher, für die einzelnen records, dann selbst reservieren (getMem, freeMem). Beim erstellen speicherst du im header, die art(kind) und die adresse(ptr) des recods ab...so kannst du später zwischen den verschiedenen records, mittels kind, differenzieren!
Wenn du fragen zu pointern hast, sag bescheid.
_________________ mfg.
mâximôv
|
|
musiktiger 
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 06.05.03 15:19
Vielen Dank Maximus!
Puh, ich glaube ich müsste dazu erstmal ganz schön viel Neues verstehen und das dauert bei mir immer so lange.
Wenn es aber nicht einfacher geht probiere ich es natürlich so.
Ich hätte gedacht, dass man zum Beispiel die variable GeomObjekt mehrfach deklarieren könnte und dann irgendwie auswählen kann welche Deklaration man gerade meint. Das aber in der Unit selbst.
Verstehe nämlich noch nicht sooo viel von Headern und Pointern und so. 
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Di 06.05.03 15:36
Hi,
eventl. ist auch ein normal Record mit varianten Teilen sinnvoll. Also so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TGeoKind = (gkCirc, gkQuad,gkTriangle...); tHeader = record // Hier allgemeine Variablen definieren
Case kind: TGeoKind of gkCirc: (VariableCirc1, VariableCirc2: Integer); gkQuad: (VariableQuad1, VariableQuad2: Integer); end;
TGeoArr : array of THeader; |
Verbraucht eventl. etwas mehr speicher aber es ist um einige einfacher zu programmieren.
Gruß
Tino
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 06.05.03 17:25
Hier gab es doch erst letztens ein ganz ähnliches Problem, wo es um Flächen ging... Ich würde eine objektorientierte Variante nehmen, also TObject-Nachfahren erstellen, welche dann in einer Objektliste verwaltet würden. Je nach Nachfahre gibt es dann unterschiedliche "Variablen" (bei TRechteck Länge und Breite, Bei TKreis Radius etc).
Cu,
Udontknow
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Di 06.05.03 18:15
@DontKnow: stimmt hatten wir...mit OOP wärs komfortabler!
@VariableRecordTeile: hatte ich auch drann gedacht...aber dann müssen die daten-teile doch immer gleich gross sein...?
// edit:
@MusikTiger: kannst dir ja mal antun -> www.delphi-forum.de/...amp;highlight=tkreis
_________________ mfg.
mâximôv
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Di 06.05.03 18:34
maximus hat folgendes geschrieben: | @VariableRecordTeile: hatte ich auch drann gedacht...aber dann müssen die daten-teile doch immer gleich gross sein...? |
Ne, eigentlich nicht!
Aber letztendlich würde ich die Objekt-Lösung nehmen.
Gruß
Tino
|
|
musiktiger 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 07.05.03 14:34
Vielen Dank,
ich habe mir die Problematik in dem anderen Forum angesehen, aber nicht herausgefunden wie mir das helfen könnte.
Ich habe mal das von Tino ausprobiert, aber es würden dann ja in jedem Record auch die Variablen z.B. für einen Kreis bereitgestellt werden, auch wenn ich ein Rechteck speichere.
Ich nehme glaube ich die Anfangslösung von Maximus.
Damit nutze ich gleich die Gelegenheit und versuche mich mal mit Pointern. Wird sowieso mal Zeit, dass ich das verstehe.
Vielen Dank an alle, ihr habt mir sehr geholfen!
Gruß,
MuTi
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mi 07.05.03 15:06
Hallo!
musiktiger hat folgendes geschrieben: | Ich habe mal das von Tino ausprobiert, aber es würden dann ja in jedem Record auch die Variablen z.B. für einen Kreis bereitgestellt werden, auch wenn ich ein Rechteck speichere. |
Nein, die einzelnen Varianten-Teile des Rekords teilen sich den Speicherbereich.
musiktiger hat folgendes geschrieben: | Damit nutze ich gleich die Gelegenheit und versuche mich mal mit Pointern. Wird sowieso mal Zeit, dass ich das verstehe. |
Dann schau Dir auch mal das neue Tutorial über Pointer in der Tutorial-Sparte an. Könnte hilfreich sein!
Gruß
Tino
|
|