AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record Verwalten - Wie am besten ?

Ein Thema von turboPASCAL · begonnen am 2. Mai 2011 · letzter Beitrag vom 3. Mai 2011
Antwort Antwort
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#1

AW: Record Verwalten - Wie am besten ?

  Alt 2. Mai 2011, 20:59
Für String und Integer kann man wirklich eine TStringList mit Objects missbrauchen
AddObject('test', Pointer(1234));
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Record Verwalten - Wie am besten ?

  Alt 2. Mai 2011, 21:35
Für String und Integer kann man wirklich eine TStringList mit Objects missbrauchen
AddObject('test', Pointer(1234));
Oder eben Zeiger auf Records
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

AW: Record Verwalten - Wie am besten ?

  Alt 2. Mai 2011, 21:38
Dann muss man die Records aber selber wieder verwalten (dyn Array etc.) insbesondere beim loaeschen einzelner Items. Dann doch lieber eine eigene Klasse mit TObjectList
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.359 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Record Verwalten - Wie am besten ?

  Alt 2. Mai 2011, 22:51
Hi,

dafür bietet sich ein Array Property an.
Allerdings würde ich das auch über eine Klasse lösen, ungefähr so:
Delphi-Quellcode:
unit MyClasses;

interface

uses
  Contnrs, SysUtils;

type
  TItem = class(TObject)
  private
    FTitel: string;
    FHandle: Integer;
  public
    property Titel: string read FTitel write FTitel;
    property Handle: Integer read FHandle write FHandle;
  end;

type
  TItemList = class(TObject)
  private
    FItems: TObjectList;
    function GetItems(Index: Integer): TItem;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(const ATitel: string; AHandle: Integer);
    procedure Clear;
    function Count: Integer;
    function ItemByName(AName: string): TItem;
    property Items[Index: Integer]: TItem read GetItems;
  end;

implementation

constructor TItemList.Create;
begin
  inherited;
  FItems := TObjectList.Create(True);
end;

destructor TItemList.Destroy;
begin
  FItems.Free;
  inherited Destroy;
end;

procedure TItemList.Add(const ATitel: string; AHandle: Integer);
Var
  AItem: TItem;
begin
  AItem := TItem.Create;
  AItem.Titel := ATitel;
  AItem.Handle := AHandle;
  FItems.Add(AItem);
end;

procedure TItemList.Clear;
begin
  FItems.Clear;
end;

function TItemList.Count: Integer;
begin
  Result := FItems.Count;
end;

function TItemList.GetItems(Index: Integer): TItem;
begin
  Result := TItem(FItems[Index]);
end;

function TItemList.ItemByName(AName: string): TItem;
Var
  i: Integer;
begin
  Result := nil;
  for i := 0 to Count - 1 do
  if SameText(FItems[i], AName) then
  begin
    Result := Items[i];
    Exit;
  end;
end;

end.
Ich glaube nur, dass Delphi 6 noch keine TObjectList hatte, oder?
Dann muss natürlich ein TList herhalten, und beim Delete und Clear die Freigabe des Objektes mit erfolgen.

Frank
Frank Reim

Geändert von dataspider ( 2. Mai 2011 um 22:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Record Verwalten - Wie am besten ?

  Alt 2. Mai 2011, 23:09
Ich weiß nicht, wie die Methode heißt, die ich gleich vorschlagen werde; ich vermute, es ist das, was bei Post #3 angesprochen wurde und zwar Hashtable. Falls es das ist, dann tut mir die Redundanz Leid

Du legst ein Array fester Größe an und schreibst dir eine Hashfunktion, die einen Maximalwert = Größe des Arrays zurückliefert. Beispiel:
Delphi-Quellcode:
MeinArray: Array[0..255] of ...;
funciton MyHashFunc(const Str: String): Byte; // liefert 0..255 zurück
Der Hash gibt den Index zum Array.

Wenn ich zb. 'ABC' habe und der Hash davon 1 ist, dann habe ich folgendes:
Code:
MeinArray[1] = 'ABC'
So, wenn nun ein weiteres Element, 'BCD', denselben Hash, 1, zurückliefert, dann füge ich es hinzu.
Code:
MeinArray[1].Next = 'BCD'
Dazu müsste man einfach eine einfach-verkettete Liste als Element verwenden.

Und wenn man nun ein Element (schnell) suchen möchte, berechnet man den Hash davon, schaut im Array nach, welches Element der Liste es ist und liefert es dann halt als Ergebnis zurück

Edit: Beim nochmaligen Lesen ist mir aufgefallen, dass du Arrays meiden möchtest.
Mit dieser Methode hier wird es aber leichter und effizienter, nach Strings zu suchen.
Falls es trotzdem nicht so das Wahre ist, dann macht das auch nichts
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.359 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Record Verwalten - Wie am besten ?

  Alt 3. Mai 2011, 09:50
bei einer RecordList musst du dich IMHO um den Speicher kümmern.
Ich habe mal ein Beispiel angehangen.

Frank
Angehängte Dateien
Dateityp: zip sample.zip (3,3 KB, 4x aufgerufen)
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#7

AW: Record Verwalten - Wie am besten ?

  Alt 3. Mai 2011, 10:05
bei einer RecordList musst du dich IMHO um den Speicher kümmern.
Ich habe mal ein Beispiel angehangen.

Frank
Zum Glück gibt es inzwischen (seit D2009) auch noch die generische TList<>, welche da vieles vereinfacht.
(auch wenn dieses eine kleine und manchmal gemeine Einschränkung besitzt, was das nachträgliche Ändern eines Recordinhaltes betrifft )

Und was den Ausgangsrecord dieses Threads betrifft: TDictionary<Handle, String> , mit Handle als Key und String als Value (oder andersrum).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Mai 2011 um 10:08 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz