Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 06, 2025 19:12

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zugriffsverletzungen mit TextSuite
BeitragVerfasst: Di Jul 21, 2009 23:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,

ich hab ein Problem mit der TextSuite und zwar hab ich mir das ganze in ne extra Klasse gekapselt, das ich das leichter benutzen kann.
uFont:
Code:
  1. unit uFont;
  2.  
  3. interface
  4.  
  5. uses
  6.   TextSuite, DGLOpenGL, Dialogs, SysUtils;
  7.  
  8. const
  9.   // Font Style
  10.   TS_STYLE_NORMAL = $00;
  11.   TS_STYLE_BOLD = $01;
  12.   TS_STYLE_ITALIC = $02;
  13.   TS_STYLE_UNDERLINE = $04;
  14.   TS_STYLE_STRIKEOUT = $08;
  15.  
  16.   // Textalign
  17.   TS_ALIGN_LEFT = $311;
  18.   TS_ALIGN_CENTER = $312;
  19.   TS_ALIGN_RIGHT = $313;
  20.   TS_ALIGN_BLOCK = $314;
  21.  
  22. type
  23.   TglFontContextID = tsContextID;
  24.   TglFont = class
  25.   private
  26.     fFontContextID: tsContextID;
  27.     fStyle: Cardinal;
  28.     fWidth: Integer;
  29.     fFileName: String;
  30.     fColor: TVector4f;
  31.     fZoom: Integer;
  32.     procedure CreateFont;
  33.   public
  34.     fFontID: tsFontID;
  35.     procedure SetColor(r,g,b,a: Single);
  36.     procedure TextOut(Text: String; X,Y,Width,Height: Single; Align: Cardinal);
  37.     constructor Create(FontContextID: tsContextID;
  38.                        Style: Cardinal;
  39.                        Width: Integer;
  40.                        FileName: String);
  41.     destructor  Destroy; override;
  42.   end;
  43.  
  44. procedure CheckError;
  45. function  CreateFontContext: TglFontContextID;
  46. procedure DestroyFontContext(ID: TglFontContextID);
  47.  
  48. implementation
  49.  
  50. procedure CheckError;
  51. var Error: tsError;
  52. begin
  53.   Error := tsGetError;
  54.   if Error <> TS_NO_ERROR then begin
  55.     ShowMessage('TextSuite error: ' + tsGetErrorString(Error));
  56.     Halt;
  57.   end;
  58.  
  59.   Error := glGetError;
  60.   if Error <> GL_NO_ERROR then begin
  61.     ShowMessage('OpenGL error: ' + gluGetString(Error));
  62.     Halt;                                                              
  63.   end;
  64. end;
  65.  
  66. function CreateFontContext: tsContextID;
  67. begin
  68.   if tsInit(TS_INIT_TEXTSUITE) = TS_FALSE then begin ShowMessage('Initialing TextSuite failed.'); Halt; end;
  69.   if tsInit(TS_INIT_OPENGL)    = TS_FALSE then begin ShowMessage('Initialing OpenGL failed.');    Halt; end;
  70.   if tsInit(TS_INIT_GDI)       = TS_FALSE then begin ShowMessage('Initialing GDI failed.');       Halt; end;
  71.  
  72.   tsContextCreate(@result);
  73. end;
  74.  
  75. procedure DestroyFontContext(ID: tsContextID);
  76. begin
  77.   tsContextDestroy(ID);
  78.   tsQuit;
  79. end;
  80.  
  81. ////////////////////////////////////////////////////////////////////////////////
  82. ////////////////////////////////////////////////////////////////////////////////
  83. ////////////////////////////////////////////////////////////////////////////////
  84.  
  85. procedure TglFont.SetColor(r,g,b,a: Single);
  86. begin
  87.   fColor[0] := r;
  88.   fColor[1] := g;
  89.   fColor[2] := b;
  90.   fColor[3] := a;
  91. end;
  92.  
  93. procedure TglFont.TextOut(Text: String; X,Y,Width,Height: Single; Align: Cardinal);
  94. begin
  95.   glEnable(GL_BLEND);
  96.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  97.  
  98.   glEnable(GL_ALPHA_TEST);
  99.   glAlphaFunc(GL_GREATER, 0.1);
  100.  
  101.   glPushMatrix;
  102.     glScalef(1/fZoom,1/fZoom,1/fZoom);
  103.     glColor4fv(@fColor);
  104.     tsSetParameteri(TS_ALIGN, Align);
  105.     tsTextBeginBlock(round(X*fZoom),
  106.                      round(Y*fZoom),
  107.                      round(Width*fZoom),
  108.                      round(Height*fZoom),
  109.                      TS_BLOCKFLAG_WORD_WRAP);
  110.       tsFontBind(fFontID);                
  111.       tsTextOutA(PAnsiChar(Text));
  112.     tsTextEndBlock;
  113.     glBindTexture(GL_TEXTURE_2D,0);
  114.   glPopMatrix;
  115.  
  116.   glDisable(GL_BLEND);
  117.   glDisable(GL_ALPHA_TEST);
  118. end;
  119.  
  120. procedure TglFont.CreateFont;
  121. begin
  122.   tsContextBind(fFontContextID);
  123.  
  124.   tsSetParameteri(TS_RENDERER, TS_RENDERER_OPENGL); CheckError;
  125.   tsSetParameteri(TS_CREATOR, TS_CREATOR_GDI); CheckError;
  126.   tsFontCreateCreator(pAnsiChar(fFileName), fWidth, fStyle, TS_DEFAULT, TS_DEFAULT, @fFontID); CheckError;
  127.   tsPostAddShadow4f(1,0,0,1,1,1,0);
  128. end;
  129.  
  130. constructor TglFont.Create(FontContextID: tsContextID; Style: Cardinal; Width: Integer; FileName: String);
  131. begin
  132.   inherited Create;
  133.   fZoom          := 2;
  134.   fFontContextID := FontContextID;
  135.   fStyle         := Style;
  136.   fWidth         := Width*fZoom;
  137.   fFileName      := FileName;
  138.   fColor[0]      := 1;
  139.   fColor[1]      := 1;
  140.   fColor[2]      := 1;
  141.   fColor[3]      := 1;
  142.   CreateFont;
  143. end;
  144.  
  145. destructor TglFont.Destroy;
  146. begin
  147.   tsFontDestroy(fFontID);  
  148.   inherited Destroy;
  149. end;
  150.  
  151. end.


Und jetzt bekomm ich ne Zugriffsverletzung wenn ich was zeichnen will:
Code:
  1.  
  2. //ausgeben:
  3. fFont.TextOut('Starten',                                                
  4.               -50, Form1.ClientHeight-100-3*MenuAbstand*50,
  5.               Form1.ClientWidth, 100,
  6.               TS_ALIGN_RIGHT);
  7.  
  8. //so hab ich den vorher erzeugt:
  9. fFont := TglFont.Create(FontContextID,                                        
  10.                         TS_STYLE_NORMAL,
  11.                         20,
  12.                         DataFiles+'LCD_FONT.ttf');

komischer Weise kommt der Fehler immer nur genau an der Stelle, wenn ich den Font wo anders benutz geht alles 1a?!
Ich hab den Fehler ma bis hierhin verfolgt:
TextSuiteClasses.pas --> Zeile 2115: SetLength(fScanLines, fHeight); in TtsImage.UpdateScanLines;

Ich hab mein ganzes Projekt auch ma auf den "Standart"-Font von OpenGL umgebaut, da funzt alles, aber zieht der unschön aus und deshalb würd ich schon gern die TextSuite benutzen... Kann sich das jmd erklären?!

Ma noch was nebenbei: ich hatte schon öfter Zugriffverletzungen wenn ich die TextSuit wie beschrieben benutz. Und entwerder ich mach total grundlegende Fehler oder die TextSuite is n bisl buggy (will dir damit aber nich auf die Füße treten LossyEx).

MfG & Thx Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 00:44 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, in welchem Bezug steht denn TtsImage zu deinem Code?
Existiert die Instanz dieser Klasse, wenn er in die Funktion geht? Was für eine Adresse steht bei der Zugriffsverletzung? Wenn dort eine sehr niedrige Zahl steht, kann es sein das die Variable, die die Adresse der Instanz halten soll, nil ist. Andernfalls wurde die Instanz vielleicht freigegeben oder man greift z.B. in einem Array auf einen ungültigen Index zu.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 09:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Schläfer: Die TtsImage ist eine Klasse innerhalb der TextSuite Bibliothek. Das ist ein Objekt welches Bildaten kappselt. Also alle Verarbeitungen innerhalb der TextSuite benutzen solch ein Objekt.

Bergman: Also ich behaupte jetzt einfach mal, dass du nicht die letzte Version hast die ich als Stabil ausgegeben habe. Grund dafür. Die von dir gepostetet Codestelle ist bei mir knapp 40 Zeilen weiter unten. Und die Methoden tsFontCreateCreator und tsGetErrorString haben bei mir ein A am Ende (weil AnsiStrings). Entsprechend solltest du dir die aktuelle Version ziehen und schauen ob es damit dann funktioniert. Denn in der 0.8er (die auch wirklich so heißt) habe ich noch einige Fehler beseitigt. Alles davor waren Entwicklerversionen. Und die können logischerweise Fehler enthalten. Ließ dir bitte auch durch was ich zu dem Release geschrieben habe.

Ich muss gestehen, dass ich das Konstrukt mit fZoom sehr verwirrend finde. Denn du erstellst augenscheinlich ein Font was doppelt so groß ist nur um es beim Zeichnen dann wieder halb so groß darzustellen. Denn durch so was hast du eigentlich nur nachteile. Sowohl Qualitativ als auch einen höheren Speicherverbrauch bei den Texturen. Abgesehen davon sieht der Code okay aus. Sollte das Aktualisieren der Quellen keine Besserung herbeiführen, dann versuch es bitte mal mit einem standard windows font. Wenn das geht muss es am Font liegen. Dann müsstest du mir deines mal zuschicken. Wenn das standard font auch nicht geht, dann muss es was anderes sein.


Kleine Anmerkung: Wenn du Probleme damit hast, dann fühle ich mich nicht auf die Füße getreten. Allerdings kann ich dir dabei nicht helfen, wenn du (oder egal wer) diese Probleme für dich behälst. Ich kann Fehler nur fixen, wenn ich auch davon weiß. Und bei dieser Bibliothek gibts einen sehr sehr kurzen Weg um mit dem Entwickler zu quatschen. Und das sogar noch Dialektfrei auf Deutsch. Okay. Bei Features ist der manchmal "etwas" störrisch. Aber Fehler sind in der Regel nie ein Thema. Also nutzt den kurzen Weg.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 15:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hi,

ich hab jetzt mal den ganzen Code der mit der TextSuite zu tun hat auskommentiert un da geht alles. Aber sobald ich FontContextID := CreateFontContext; wieder mit rein nehm stürzt er ab.
Dann hab ich mir die v0.8 geladen (hatte noch ne alte, aber die Idee nach ner neuen Version zu gucken kam mir erst heut früh^^). Mit der v0.8 funzt es wieder. Aber sobald ich CreateFont; (aus meiner uFont-Unit im TglFont-Creator) wieder „ein“-kommentier, kommt wieder ne Zugriffsverletzung. Komischer Weise aber erst viel später im Code wenn ich die Länge von nem Array neu setze?!
das mit dem fZoom hatte ich gemacht weil die Kanten von dem Font da net so ausgefranzt sind, aber das wollt ich sowieso nochma überarbeiten ^^
Fazit: Wenn ich den TextSuite-Code auskommentier gehts, sobald er aber drin is spinnt er an unerklärlichen Stellen rum.

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wo genau kommt denn da der Fehler? Könntest du eventuell mal durch die Methode steppen und mal schauen wo die Zugriffsverletzung her kommt? Eventuell auch mal RangeChecks und all so was aktivieren. Denn ich kann mit deiner Beschreibung gerade nicht viel anfangen. Und der Code von Oben sieht auch okay aus. Da kann ich gerade leider nicht mal sinnvoll raten.

Hattest du es mal mit einem anderen Font (Arial oder so was) probiert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hi,

mit nem anderen Font gehts auch net...
Un der fehler kommt jetzt in meinem Code. Wenn ich den ganzen TextSuite-Code auskommentier gehts wieder?!
jedesmal wenn ich einen Fehler halbwegs behoben hab kommt ein neuer an einer noch unerklärlicheren stelle...
(Zeile 53.)
Code:
  1. //erzeugt das Objekt
  2. constructor TMainMenu.Create(FontContextID: TglFontContextID);
  3. var i, j: Integer;                                                              //Zählvariablen
  4. var Turn: Real;                                                                 //speichert den Drehwinkelwinkel eines Kreises in der Röhre
  5. begin
  6.   inherited Create;                                                             //serzeugen
  7.  
  8.   fFader      := 0;                                                             //Variablen initialisieren
  9.   fLevelFader := 0;
  10.   fTurn       := 0;
  11.   fMenuTurn   := 0;
  12.   fSelected   := 3;
  13.   fMin        := 0;
  14.   fMax        := 3;
  15.   fHelpIndex  := 0;
  16.   fToDraw     := tdMain;
  17.   fEnter      := True;
  18.   fEscape     := True;
  19.   fUpDown     := True;
  20.  
  21.   SetLength(fLevelList,0);                                                      //Länge der LevelListe setzen
  22.  
  23.   fFont := TglFont.Create(FontContextID,                                        //MenüFont erzeugen
  24.                           TS_STYLE_NORMAL,
  25.                           20,
  26.                           DataFiles+Font);
  27.  
  28.   fInfoFont := TglFont.Create(FontContextID,                                    //InfoFont erzeugen
  29.                               TS_STYLE_NORMAL,
  30.                               10,
  31.                               DataFiles+Font);
  32.  
  33.   fMenuBallTex := TglBitmap2D.Create;
  34.  
  35.   fEnemyShip := TShip.Create;                                                   //Gegnerschif erzeugen
  36.   fEnemyShip.LoadFromFile(DataFiles+'small_enemy.ship');                        //Gegnerschiff aus Datei laden
  37.  
  38.   fPlayerShip := TShip.Create;                                                  //SpielerSchiff erzeugen
  39.   fPlayerShip.LoadFromFile(DataFiles+'player_ship.ship');                       //SpielerSchiff aus Datei laden
  40.  
  41.   SetLength(fShips, ShipCount);                                                 //Länge der SchiffListe setzen
  42.   for i := 0 to ShipCount do                                                    //Alle schiffe durchzählen
  43.     begin
  44.       fShips[i].Turn := random(360);                                            //Randomwerte erzeugen
  45.       fShips[i].Roll := random(360);
  46.       fShips[i].TurnTo := (random(5)+1)/10;
  47.       fShips[i].RollTo := (random(11)-5)/10;
  48.     end;
  49.  
  50.   SetLength(fTubePoints, Circles);                                              //Listengröße auf Anzahl der Kreise setzen  
  51.   for i := 0 to High(fTubePoints) do                                            //Alle Kreise durchzählen
  52.     begin
  53. //-->Hier kommt der Fehler nach dem 5. Durchlauf
  54.       SetLength(fTubePoints[i], PointsPerCircle);                               //Listengröße auf Anzahl der Vertex pr Kreis setzen
  55.       Turn := 2*Pi*i/Circles;                                                   //Winkel des Kreises berechnen
  56.       for j := 0 to High(fTubePoints[i]) do                                     //Punkte auf dem kreis durchzählen
  57.         begin
  58.           fTubePoints[i,j,0] := sin(2*Pi*j/PointsPerCircle)*TubeSize*cos(Turn); //Vertex der Kreise berechnen
  59.           fTubePoints[i,j,1] := cos(2*Pi*j/PointsPerCircle)*TubeSize;
  60.           fTubePoints[i,j,2] := sin(2*Pi*j/PointsPerCircle)*TubeSize*sin(Turn);
  61.  
  62.           fTubePoints[i,j,0] :=                                                 //Position des Kreises in der Röhre berechnen
  63.             cos(Turn)*CircleSize + fTubePoints[i,j,0];
  64.           fTubePoints[i,j,2] :=
  65.             sin(Turn)*CircleSize + fTubePoints[i,j,2];
  66.         end;
  67.     end;
  68.  
  69.   SetLength(fMenuPoints, MenuPoints);                                           //Listenlänge auf Anzahl der Punkte pro Kreis setzen
  70.   for i := 0 to MenuPoints-1 do                                                 //Alle Punkte durchzählen
  71.     begin
  72.       Turn := 2*Pi*i/MenuPoints;                                                //Drehwinkel berechnen
  73.       fMenuPoints[i,0] := cos(Turn);                                            //Vertex berechnen
  74.       fMenuPoints[i,1] := sin(Turn);
  75.       fMenuPoints[i,2] := 0;
  76.     end;
  77.  
  78.   SetLength(fHelpTipps, 3);                                                     //Listenlänge auf Anzahl der Tipps setzen
  79.   fHelpTipps[0] :=                                                              //Tipps in die Liste eintragen
  80.     'Sinn des Spieles ist es Feinde abzuschießen, um Punkte zu erhalten. '+
  81.     'Am Ende jedes Levels gibt es einen Endgegner den man bezwingen muss, '+
  82.     'eh man in das nächste Level vordringen darf.';
  83.   fHelpTipps[1] :=
  84.     'Steuerung:'+chr(13)+
  85.     'links/lechts: in der Röhre nach links/rechts drehen'+chr(13)+
  86.     'vor/zurück: Shiff beschleunigen/bremsen'+chr(13)+
  87.     'x: schießen';
  88.   fHelpTipps[2] :=
  89.     'PowerUps:'+chr(13)+
  90.     'Mit diesem PowerUp verbessert man die Waffensysteme des Schiffs'+chr(13)+'-'+chr(13)+
  91.     'Mit diesem PowerUp füllt man sein Leben wieder auf, für jedes PowerUp gibt es einen Lebenspunkt.';
  92.  
  93.   fLevel := TLevel.Create(FontContextID);
  94. end;
  95.  


MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du. Wenn du sagst, dass es funktioniert sobald die TextSuite auskommentiert ist, dann glaube ich das. Heißt aber nicht, dass ich dadurch wissen kann woran das Problem liegt, oder? Hatte das auch schon oft genug, dass es bei A kracht obwohl X irgendwo im Speicher murks macht. Ich persönlich arbeite eher selten mit Array on array of array. Hatte damit auch schon so das ein oder andere Problem.

Das Einzige was du ausprobieren könntest wäre die Benutzung der externen DLL. Dann sind die Speicherbereiche getrennt. Dazu müsstest du in der TextSuite.inc das Define TS_EXTERN_STATIC aktivieren.

Alternativ kann ich dir nur anbieten, dass du mir das mal schickst und ich mir das mal anschaue. Vertraulich versteht sich. Sonst wüsste ich so nicht wie ich dich dabei überhaupt unterstützen kann. Das was ich sehe sieht gut aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 22, 2009 22:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

sry wegen den vielen Wiederholungen, ich mach das öfters xD
Hab jetzt ma die DLL genommen, damit komm ich bis ins Hauptmenü meines Programms, aber sobald ich ein Untermenü auswählen will stürzt er ab. aber das geht auch nur mit Arial. Mit dem LCD-Font schmiert er gleich beim Start ab...
Wäre vlt doch besser wenn ich dir das ma schick. Ich schick dir ne PN.

€: hab grad n großen teil von meinem Code gelöscht weil ich den nochma komplet überarbeiten muss und sie da, es geht wieder alles?!
jetzt hab ich an paar anderen sachen weiter geschrieben und auf einma geht alles wieder von vorn los -.-
programm ging erst, dann hab ich EINE neue Zuweißung in ne ganz normale Varaiable gemacht und auf einma funzt gar nix mehr.
dann hab ich die TextSuite wieder auskommentiert, weil ich dachte es liegt daran, aber diesmal hat es nix geholfen (ändert sich bloß die Adresse in der fehlermeldung).
irgendwie kommt es mir so vor, als ob bei einer bestimmten Programmgröße alles verrückt spielt. Ich dachte immer so krasse Zugriffsverletzungen kann man nur bekommen wenn man nich aufpasst, was man mit seinen Zeigern macht, aber ich benutz ja noch nichma wirklich welche?! Langsam hab ich kein bock mehr auf den mist -.-

MfG & Thx Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 23, 2009 08:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ah. Ich sehe du hast gerade editiert. Oder es liegt am noch fehlenden Kaffee. ;)

Zu deinen Problem. Es müssen nicht immer Zeiger sein. Nur bei Zeigern geht es besonders schnell. Was auch klassisch ist sind Arrays. Da passiert es gerne, dass man mal über die Grenzen des Arrays gerät. Bei TStream.Read kann es auch leicht passieren, dass in einen anderen Speicherbereich reingeschrieben wird. Deswegen denke ich, dass du irgendwo ein mal etwas gröber über deinen Speicherbereich schreibst und dabei andere wichtige Dinge überschreibst. Und dann bekommst du Fehler an den unterschiedlichsten Stellen. Je nachdem was gerade dort im Speicher liegt. Und dazu reicht dann wirklich schon eine solche Überschreibung.

Für so etwas solltest du zum Beispiel die Bereichsprüfung aktivieren. Bzw mal FastMM installieren. Der zeigt dir Speicherlöcher an und bei Zugriffen auf freigegebene Objektinstanzen gibts direkt Exceptions.

Generell was zu Pointern: Pointerähnliche Strukturen sind an sich nicht schlimm. Klar sie sind potentiell gefährlicher. Aber wenn man diszipliniert und aufmerksam damit arbeitet, dann hat man in der Regel wenig Böses zu erwarten. Was alternativ zu Pointer gern gemacht wird sind sehr komplexe Arraystrukturen. Arrays sind in der Verwaltung deutlich langsamer und ich habe früher bei so etwas auch häufiger Probleme gehabt. Mittlerweile benutze ich sehr oft die Kombination aus Records und TList. Das Record enthält alle Felder des jeweiligen Items. Ein Pointer auf das Record wird mit New erstellt und der Pointer dann in die Liste gepackt. Wenn er nicht mehr benötigt wird dann mit Dispose löschen. Wenn anstelle der Records Klassen sinn machen dann natürlich Klassen.

PS: Mein Angebot bleibt weiter bestehen. Da Antworte ich dir aber gleich auf die PN.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 15 Queries | GZIP : On ]