Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#7

Re: TList ableiten - Pointer -> eigener Pointertyp

  Alt 25. Jul 2006, 19:32
irgendwie habe ich meinen Beitrag wieder editiert anstatt einen neuen Betrag zu erstellen.
(Könnte man die Buttons nicht irgendwie total grell bunt und verschiedenfarbig gestalten ?
ich hatte noch geschrieben: (hier stand noch)

Zitat:
Wenn du sowas als Live-Template realisieren willst, hast du redundanten Code
dass das mich überzeugt hat ! Und wenn ich die Livetemplages von der IDE benutze wird das ja so groß dass man eventuell dafür sowieso eine neue Unit anlegt, also kann man für die Deklaration sowieso eine zweite Unit anlegen. Man muss halt nur aufpassen, dass man nicht zweimal dasselbe Template in einer Unit benutzt.

und nun der Text ..


-----------------

also das mit den IFDEF Konstruktionen scheint eine kompliziertere Sache zu sein, als mein kleines Hirn überblicken kann.
Es ist zwar so, dass meine Variante korrekt zu compilieren geht, aber da funktioniert erstaunlicherweise die Codevervollständigung nicht mehr !
Also das ist irgendwie unlogisch, verstehen tu ich es nicht, na egal.
Man kann es sich aber dennoch vereinfach, wenn man IMMER

{$DEFINE TEMPLATE_DEVELOP} schreibt. Da muss man sich nicht soviel merken !
Außerdem braucht man das nur einmal pro Unit zu deklarieren.
Das macht das ganze noch etwas übersichtlicher.
Das das so ist, ist dennoch unlogisch für mich.
Wenn mal jemand eine typsichere gute alte Liste vom Typ TList benötigt, hier mal der Vollständige Code (Keine Objectliste).

basierend auf der Idee:

http://www.dummzeuch.de/delphi/objec...s/deutsch.html

Hier die Deklaration.

Delphi-Quellcode:
unit u_LabelList;
{$DEFINE TEMPLATE_DEVELOP}

interface

uses
  Sysutils,
  Classes,
  Contnrs,
  StdCtrls;

type

  _TLIST_ITEM = TLabel;
    {$I tmpl_TList.pas}
  TLabelList = class(_TLIST)
  end;



implementation

{$I tmpl_TList.pas}



end.


Hier das TLIST Template

Delphi-Quellcode:
//{$DEFINE TEMPLATE_DEVELOP}
{$IFNDEF TEMPLATE_DEVELOP}
unit tmpl_TList;

interface

// copy these units into the uses clause of every unit using this template
uses
  Sysutils,
  Classes,
  Contnrs;

type
  _TLIST_ITEM = Pointer;
{$ENDIF TEMPLATE_DEVELOP}

{$IFNDEF _TLIST_SECOND_PASS}
type
  _TLIST = class(TLIST)

  protected
    function Get(Const Index: Integer): _TLIST_ITEM;
    procedure Put(Const Index: Integer; Item: _TLIST_ITEM);
  public
    function Add(Const Item: _TLIST_ITEM): Integer;
    function Extract(Const Item: _TLIST_ITEM): _TLIST_ITEM;
    function First: _TLIST_ITEM;
    function IndexOf(Const Item: _TLIST_ITEM): Integer;
    procedure Insert(Const Index: Integer; Item: _TLIST_ITEM);
    function Last: _TLIST_ITEM;
    function Remove(Const Item: _TLIST_ITEM): Integer;
    property Items[Const Index: Integer]: _TLIST_ITEM read Get write Put; default;

  end;

{$ENDIF _TLIST_SECOND_PASS}

{$IFNDEF TEMPLATE_DEVELOP}
implementation
{$DEFINE _TLIST_SECOND_PASS}
{$ENDIF TEMPLATE_DEVELOP}

{$IFDEF _TLIST_SECOND_PASS}

{ _TLIST }



//==============================================================================
function _TLIST.Add(Const Item: _TLIST_ITEM): Integer;
begin
  Result := inherited Add(Pointer(Item));
end;
//==============================================================================
function _TLIST.Extract(Const Item: _TLIST_ITEM): _TLIST_ITEM;
begin
   Result := _TList_ITEM(inherited Extract(Pointer(Item)));
end;
//==============================================================================
function _TLIST.First: _TLIST_ITEM;
begin
   result := _TLIST_ITEM(inherited First);
end;
//==============================================================================
function _TLIST.Get(Const Index: Integer): _TLIST_ITEM;
begin
   result := _TLIST_ITEM(inherited get(Index));
end;
//==============================================================================
function _TLIST.IndexOf(Const Item: _TLIST_ITEM): Integer;
begin
   result := inherited indexof(Pointer(item));
end;
//==============================================================================
procedure _TLIST.Insert(Const Index: Integer; Item: _TLIST_ITEM);
begin
   inherited insert(index, Pointer(item));
end;
//==============================================================================
function _TLIST.Last: _TLIST_ITEM;
begin
  result := _TList_ITEM(inherited last);
end;
//==============================================================================
procedure _TLIST.Put(Const Index: Integer; Item: _TLIST_ITEM);
begin
  inherited put(index, Pointer(item));
end;
//==============================================================================
function _TLIST.Remove(Const Item: _TLIST_ITEM): Integer;
begin
  result := inherited remove(Pointer(item));
end;
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================



{$WARNINGS off}
{$IFNDEF TEMPLATE_DEVELOP}
end.
{$ENDIF TEMPLATE_DEVELOP}
{$ENDIF _TLIST_SECOND_PASS}
{$DEFINE _TLIST_SECOND_PASS}
Wenn man nicht vor hat, die Unit weiterzuentwickeln, dann kann man

{$DEFINE TEMPLATE_DEVELOP} auch ganz oben in die Unit schreiben und spart sich das beim deklarieren von einem Nachfahr dieser Liste.
Dann geht aber wie gesagt die Codevervollständigung nicht mehr.



und hier der Beweis dass es eine Typsichere Liste ist
Miniaturansicht angehängter Grafiken
label_158.png  
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat