AGB  ·  Datenschutz  ·  Impressum  







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

TListBox.Items.Add overloaden

Ein Thema von iphi · begonnen am 2. Mai 2021 · letzter Beitrag vom 2. Mai 2021
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

TListBox.Items.Add overloaden

  Alt 2. Mai 2021, 10:14
Delphi-Version: 7
Hallo,

ich möchte mir eine Variante von TListBox kreieren (z.B. TLogListBox), bei der die Methode Items.Add durch meine eigene Variante überladen wird.
Darin möchte ich z.B. jedes hinzugefügte Item auch in eine Log-Datei schreiben.

Ich habe sowas (abgeleitetes Objekt mit geänderter Methode) noch nie gemacht.
Kann mir jemand bitte Starthilfe geben?

Oder gibt es eine einfachere Möglichkeit?

Danke.

P.S.

Soweit bin ich:
Delphi-Quellcode:
unit ULogListBox;

interface

uses
  Windows, Messages, SysUtils, Classes, StdCtrls;

type
  TLogStrings = class(TStrings)
  public
    function Add(const S: string): Integer; virtual;
  end;


type
  TLogListBox = class(TListBox)
  private
    _logfile: string;
  published
    property LogFile: String read _logfile write _logfile;
  end;

procedure Register;

implementation


function TLogStrings.Add(const S: string): Integer;
begin
  Result := GetCount;
  Insert(Result, S);
  writeln(s);
end;


procedure Register;
begin
  RegisterComponents('Samples', [TLogListBox]);
end;

end.
Wie verheirate ich die modifizierten TStrings mit TLogListBox?

Geändert von iphi ( 2. Mai 2021 um 10:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TListBox.Items.Add overloaden

  Alt 2. Mai 2021, 11:21
Erstmal ist dein Vererbung falsch.
TStrings ist nur der öffentliche Typ, aber Intern ist es ein TListBoxStrings.

Delphi-Quellcode:
type
  TLogStrings = class(TListBoxStrings)
  public
    function Add(const S: string): Integer; virtual;
  end;
Und genauso, wie beim TMemo/TMemoStrings, bist du hier total am Arsch, denn du kannst das nicht ableiten, weil jemand auf die saudämliche Idee kam und diesen Typen nur im Implementation der Vcl.StdCtrls (Delphi 7 ohne Vcl.) deklariert hat, wo du nicht ran kommst.


In der LitBox gibt es irgendwo das TListBoxStrings.Create für diese TStrings. (hier direkt im Contructor)
Da müsstest du schauen, ob es virtuel ist und du dort stattdessen deine Klasse erstellen kannst.


Aber mach es dir doch einfach.
Und löse dein Probleme mir einem Class-Helper.

Delphi-Quellcode:
type
  TLogStrings = class helper for TStrings
  public
    function Add(const S: string): Integer;
  end;
Da in der TListBox öffentlich TStrings definiert ist und kein "eigener" Typ, hängt dieser Helper zwar nun "überall", an allen TStrings (sobald deine Unit mit dem Helper im Uses steht), aber wenn dich das nicht stört, dann ist es die einfache Lösung.
Natürlich kannst den Helper auch nur lokal in diese eine Unit, in Interface oder Implementation deklarieren und nur dort an allen TStrings benutzen.

[edit]
Mit Delphi 7 bist du geliefert, da hast du keine Möglichkeit. (die Class-Helper gibt es dort noch nicht)
Tipp: Community-Edition?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Mai 2021 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#3

AW: TListBox.Items.Add overloaden

  Alt 2. Mai 2021, 12:23
Wieso ist das so kompliziert?
Delphi-Quellcode:
unit LogListBox;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Dialogs;

type
  TLogListBox = class(TListBox)
  private
    { Private-Deklarationen }
    fLogFileName : String;
  protected
    { Protected-Deklarationen }
    procedure WriteLn(Item : String);
  public
    { Public-Deklarationen }
    function Add(Item: string): Integer;
    procedure AddItem(Item: String; AObject: TObject); override;
  published
    { Published-Deklarationen }
    property LogFileName : String read fLogFileName write fLogFileName;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TLogListBox]);
end;

procedure TLogListBox.WriteLn(Item : String);
begin
  // Hier kommt die Implementierung für das Schreiben in die Datei fLogFileName hin.
  ShowMessage(Item);
end;


procedure TLogListBox.AddItem(Item: String; AObject: TObject);
begin
  inherited AddItem(Item, AObject);
  WriteLn(Item);
end;

function TLogListBox.Add(Item: String) : Integer;
begin
  AddItem(Item, nil);
  Result := Items.Count;
end;

end.
Mit meinem Delphi 7 funktioniert das.

Aufrufmöglichkeiten:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  LogListBox1.AddItem('** AddItem **',nil);
  LogListBox1.Add('** Add **');
end;
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#4

AW: TListBox.Items.Add overloaden

  Alt 2. Mai 2021, 14:51
Danke für die Tipps!
Gute Idee, AddItem zu überladen, geht gut!
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TListBox.Items.Add overloaden

  Alt 2. Mai 2021, 15:52
Ich bin der Meinung das man auch mit älteren Delphis "Intercepten" kann.
Bei Interesse einfach mal hier danach suchen.
So würde ich vorgehen.
Ohne Probleme neue Felder mit aufnehmen (Dateiverwaltung...), vorhandene Felder "inheriten" und abändern etc (save...)
Letzten Endes braucht man nur die "uses" am Ende um eine Unit erweitern, und je nach genutzen Feld ("fUseNew" als boolean in intercepted class zBsp) wird neue oder originale Variante genutzt.
Gruß vom KodeZwerg
  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 00:57 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