AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

array of record mit case bedingung?

Offene Frage von "gabneo"
Ein Thema von gabneo · begonnen am 27. Nov 2008 · letzter Beitrag vom 28. Nov 2008
Antwort Antwort
gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

array of record mit case bedingung?

  Alt 27. Nov 2008, 14:10
Hallo liebe DP-Gemeinde!


Ich habe folgende Variablendeklaration:
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.
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#2

Re: array of record mit case bedingung?

  Alt 28. Nov 2008, 11:51
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^^)
narf - not a real function
  Mit Zitat antworten Zitat
gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: array of record mit case bedingung?

  Alt 28. Nov 2008, 13:13
Hallo HenKst,

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

greez
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 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