Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi array of record mit case bedingung? (https://www.delphipraxis.net/124936-array-record-mit-case-bedingung.html)

gabneo 27. Nov 2008 14:10


array of record mit case bedingung?
 
Hallo liebe DP-Gemeinde!


Ich habe folgende Variablendeklaration:
Delphi-Quellcode:
var table1,table2: array of record textsize:byte; text,item:string; x,y,height,width:integer; end;
Nun möchte ich das nur im Ausnahmefall -> case textsize:byte of 2: (x1,y1,width1,height1:integer) <- die Variablen x1,y1 usw. angefügt werden.

Wie kann ich das denn machen? Mit variante Records kenn ich mich noch nicht soo aus.

Also noch ausgeschrieben: Ich wünsche mir quasie eine Tabelle, die nur bei bestimmten-gefilterten einträgen 4 Integer/Felder mehr besitzt.

Viiiieeeeelen DANK für eure Ideen!!!
greez


PS: Wahrscheinlich wurde es schon mal gelöst, nur hab ichs nicht gefunden...bzw. wusste nicht nach was ich suchen sollte.

HenKst 28. Nov 2008 11:51

Re: array of record mit case bedingung?
 
Ich denke nicht dass das genau so geht wie du es möchtest.

Eine record muss bei der declaration wissen wieviel Speicher er braucht.

Du kannst zwar einen Variant Record bauen der dir nur einen Teil seines Speichers ausgibt,
Delphi-Quellcode:
TBeispiel = record
  case integer of
    1: (zahl1: integer;);
    2: (zahl2: int64;);
  end;
end;
// gibt jenachdem welche zahl du ansprichst verschiedene typen zurück
// wenn ein int32 drin steht geben beide das gleiche ergebnis
// wenn ein int64 drin steht gibt zahl1 nur die unteren 32bit zurück, zahl2 aber den gesamten int 64
aber es wird trotzdem soviel angelegt wie maximal gebraucht wird.
Der case gibt nur verschiedene möglichkeiten an den angelegten Speicher zu interpretieren, aber alle variablen zeigen auf die gleiche Stelle im Speicher.

Wenn es also darum geht Speicher zu spaaren geht das meiner Meinung nach so nicht.
Und da du den einen Teil der Variablen ja in jedem Fall brauchst, macht es genau garkeinen Unterschied ob du den zweiten Teil in einem case declarierst.

Du könntest aber ein Zweidimensionales array anlegen und nur in deinem Einzelfall etwas in das zweite Feld schreiben.

Delphi-Quellcode:
  TBeispiel = record
    Textsize: byte;
    text, item: string;
    x, y, height, width: integer;
  end;
var
  table1, table2: array of array of TBeispiel;

procedure Fill;
var
  beispiel1: TBeispiel;
  beispiel2: TBeispiel;
begin
  beispiel1:= irgendwas;
  beispiel2:= irgendwas;// irgendwas in die records schreiben^^
  setlength(table1, 1, 1);//speicher für das erste element der tabelle anlegen
  table1[0,0] := beispiel1;// erstes tabellenelement füllen
  if table1[0].textsize = 2 then begin//testsize abfragen
    setlength(table1, 1, 2);//speicher für das zweite element der tabelle anlegen
    table1[0,1]:= beispiel2;//zweites tabellenelement füllen
  end;
end;
//nicht getestet^^

Das wäre mein Ansatz um Speicher zu spaaren.

table1/2 sind arrays in denen zum einen dein record steht und zum andern noch ein record für die zusätzlichen variablen.
Der zweite record wird aber nur angelegt(per setlenght(table,1,2)) wenn textsize = 2 ist. Damit spaarst du dir in allen fällen in denen textsize <> 2 ist den gesamten Speicher für den zweiten record. (in den restlichen hast du durch meine Faulheit 25 überflüssige bytes in den beiden strings und dem byte, aber ist ja nur ein Ansatz^^)

gabneo 28. Nov 2008 13:13

Re: array of record mit case bedingung?
 
Hallo HenKst,

vielen Dank! Problem schnell und effizient gelöst.
nice :zwinker:

greez


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz