AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TObjectList sehr anfällig?

Ein Thema von EWeiss · begonnen am 26. Aug 2012 · letzter Beitrag vom 31. Aug 2012
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 10:19
Das ButtonExists würde ich umschreiben oder das Button( Btn : Integer ).

Delphi-Quellcode:
function TClsProgBar.ButtonExists( Btn : Integer ) : Bool;
begin
  Result := ( Btn >= 0 ) and ( Btn < FButtonList.Count );
end;
Die genaue Codierung hängt allerdings davon ab, ob du 0 basierend indizierst (so wie die Liste) oder 1 basierend.
Danke euch werde die Infos mal durchgehen und sehen ob ich dann auf einen nenner komme.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 10:34
Das umschreiben der ButtonExists sorgt zumindest dafür das es zu keinen ElistError mehr kommt.

Wenn ich hingegen irgendeine Zeile von AddButton entferne dann kracht es wieder.
Delphi-Quellcode:
function TClsProgBar.AddButton(var oButton: TClsButtonInfo): Bool;
begin
  if ButtonExists(oButton.Num) then
    RemoveButton(oButton.Num);

  FColButtons.Add(oButton); // kann nicht entfernt werden
  FColButtons.Insert(oButton.Num, oButton); // Das auch nicht

  Result := True;

end;

Wirklich kompiliziert die Collection von VB nach Delphi zu portieren.
Hier sind mal die VB Teile dazu..
mcolButtons = Collection und in Delphi halt die TObjectList.

Code:
Public Function AddButton(ByRef roButton As clsButtonInfo) As Boolean

    If ButtonExists(roButton.Num) Then RemoveButton roButton.Num

    mcolButtons.Add roButton, CStr(roButton.Num)

End Function
Code:
Public Property Get Button(ByVal vlBtn As Long) As clsButtonInfo

    On Error Resume Next

        Set moSelButton = mcolButtons.Item(CStr(vlBtn))

        Set Button = moSelButton
        Err.Clear

End Property
Code:
Private Function ButtonExists(ByVal vlBtn As Long) As Boolean

Dim oButton As clsButtonInfo

    Set oButton = Button(vlBtn)
    ButtonExists = CBool(Not oButton Is Nothing)

End Function
Nur das ihr den Unterschied sehen könnt.
Sorry habe mich noch nie mit der ObjectList beschäftigt.

Nebenbei:
Es geht hier nicht um Copy/Paste
Es ist ein Programm das ich 1999 in VB geschrieben habe was da auf der VB seite abgeht weiss ich und stellt kein problem dar.

gruss

Geändert von EWeiss (26. Aug 2012 um 10:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#3

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 11:10
Wenn ich hingegen irgendeine Zeile von AddButton entferne dann kracht es wieder.
Delphi-Quellcode:
function TClsProgBar.AddButton(var oButton: TClsButtonInfo): Bool;
begin
  if ButtonExists(oButton.Num) then
    RemoveButton(oButton.Num);

  FColButtons.Add(oButton); // kann nicht entfernt werden
  FColButtons.Insert(oButton.Num, oButton); // Das auch nicht

  Result := True;

end;
Dann solltest du herausfinden, warum es dann kracht, denn die beiden Zeilen machen zweimal das fast gleiche. Beim Add wird der Button an die TObjectList angehängt und beim Insert nochmal an der übergebenen Stelle eingefügt. Nach dem ersten Aufruf von AddButton enthält die TObjectList somit zwei Elemente (Buttons), wobei es sich aber um dieselbe Instanz eines Buttons handelt. Leider konnte ich nocht nicht erkennen, ob die TObjectList mit OwnsValues kreiert wurde. Dann gibt es nämlich spätestens beim Entfernen der Buttons ganz massive Probleme. Außerdem gibt TObjectList.Count die Anzahl der Elemente zurück, die immer das doppelte der Anzahl der Buttons entspricht.

Der Code mit Add und Insert ist in jedem Fall falsch.

Gib doch bitte mal den kompletten Code mitsamt ButtonExists uhnd RemoveButton, damit man mal den Überblick bekommt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 11:16
Zitat:
Gib doch bitte mal den kompletten Code mitsamt ButtonExists uhnd RemoveButton, damit man mal den Überblick bekommt.
Dann wäre es einfacher den Quelltext anzuhängen.
Da hier zu viele dinge zugehörig sind.

Ich habe ihn so klein wie möglich gehalten zwei Skins müssen sein zum gegenprüfen.
Die aktuell relevanten teile befinden sich in uProgBar
Das ist eine Common Classe die später auch für ProgStart verwendet wird.

gruss

Geändert von EWeiss (26. Aug 2012 um 12:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#5

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 12:11
Ein paar Dinge gleich nach dem ersten Duchsehen:
  1. Der Index in TObjectList ist 0-basiert, TClsButtonInfo.Num fängt aber bei 1 an.
  2. Das Löchen von Elementen aus einer Liste funktioniert nur dann richtig, wenn man for I:=<ende> downto <start> do verwendet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 12:26
  1. Das Löchen von Elementen aus einer Liste funktioniert nur dann richtig, wenn man for I:=<ende> downto <start> do verwendet.
Oder von <start> bis <ende> und dabei immer nur auf den kleinsten Index zugreift.

Tja, die Collection in Delphi registriert sich bei ihren enthaltenen TComponents und auch andersrum.
Sobald einer er Beteiligten freigegeben wird, wird die aufgebaute Verknüpfung aufgelöst und die Komponenten aus der Liste ausgetragen.

Siehe meine Firemonkey-Hints. Da hab ich dieses auch endlich selber mal verwendet. Dort speichere ich mir ja in Variablen Zeiger auf die beteiligten Objekte. Um diese Variablen "sauber" zu halten und keine "tote" Verlinktungen zu erhalten, hab ich meine Ojekte ebenfalls entsprechend registriert und räume bei Benachrichtigung dann entsprechend meine Variablen auf.


Wer es nicht schafft seine Verlinkungen sauberzuhalten und eindeutige Besitzverhältnisse sichzustellen (nur Einer darf etwas freigeben ... halt das Highlander-Prinzip "Es kann nur Einen geben") oder es so zu regeln, daß sich alle beteiligten Verantwortlichen untereinander informieren, der sollte besser auf Interfaces umsteigen oder auf andere Managed-Systeme.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Aug 2012 um 12:32 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 12:27
Zitat:
Oder von <start> bis <ende> und dabei immer nur auf den kleinsten Index zugreift.
Geht aber auch nur bei bedingungslosem Löschen
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 12:55
Ein paar Dinge gleich nach dem ersten Duchsehen:
  1. Der Index in TObjectList ist 0-basiert, TClsButtonInfo.Num fängt aber bei 1 an.
  2. Das Löchen von Elementen aus einer Liste funktioniert nur dann richtig, wenn man for I:=<ende> downto <start> do verwendet.
Ja ich weiss deshalb sagte ich auch in einem der Beiträge das ich den ersten Button nicht in die ObjectList eingetragen habe.
Es scheint so das die ObjectListe damit nicht klar kommt wenn du sagst das ich unbedingt mit 0 anfangen muss.

Es dürfte klar sein das wenn man Button zu einem Fenster zur Laufzeit addiert dann muss zumindest 1 vorhanden sein der auch nicht gelöscht werden darf.
Dieser repräsentiert den Index 0;

Ich habe versucht bei 0 anzufangen in dem ich einfach

FSelButton := (FColButtons.Items[Btn -1]) as TClsButtonInfo;
Btn -1 zugewiesen habe..

Aber auch das habe ich schon angemerkt dann meldet er mir das der ListIndex Maximum(0) überschritten wäre.
Fange ich bei eins an meckert er das ListIndex Maximum(1) überschritten ist.

Da hab ich noch was zu tun

Zitat:
1.Das Löchen von Elementen aus einer Liste funktioniert nur dann richtig, wenn man for I:=<ende> downto <start> do verwendet.
Müßte ich dann noch ändern.
In der Collection VB seite spielte das keine rolle.

Danke für die überprüfung.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: TObjectList sehr anfällig?

  Alt 26. Aug 2012, 13:48
Das addieren geht jetzt grundsätzlich schon mal
Muss jetzt nur noch das problem mit dem entfernen Korrigieren.

Hab da mit der Liste noch nicht den richtigen ansatz gefunden.
Habe da mal temporär die Indexes der Button als Caption addiert.

gruss

Geändert von EWeiss (27. Aug 2012 um 05:18 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: TObjectList sehr anfällig?

  Alt 27. Aug 2012, 19:33
Hi,

ist so etwas gemeint?

Delphi-Quellcode:
unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Spin, uButtons;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    sedtBtnCount: TSpinEdit;
    btnCreate: TButton;
    gbButtons: TGroupBox;
    ButtonPanel: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnCreateClick(Sender: TObject);
  private
    { Private-Deklarationen }
    FMyButtonList : TMyButtonList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  FMyButtonList := TMyButtonList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FMyButtonList.Free;
end;

procedure TForm1.btnCreateClick(Sender: TObject);
var
  I, L : Integer;
  MB : TMyButton;
begin
  L := 2;
  for I := FMyButtonList.Count to sedtBtnCount.Value -1 do
  begin
    MB := TMyButton.Create(ButtonPanel);
    MB.Width := 50;
    MB.Height := 25;
    MB.Left := L + (I * 50);
    MB.Top := 2;
    MB.Parent := ButtonPanel;
    MB.Index := FMyButtonList.Add(MB);
  end;
end;

end.
Und

Delphi-Quellcode:
unit uButtons;

interface

uses
  Classes, StdCtrls, Contnrs;

type
  TMyButtonList = class(TObjectList)
  public
    function Add(AObject: TObject): Integer;
  end;

  TMyButton = class(TButton)
  private
    FIndex : Integer;
    procedure SetIndex(Value : Integer);
  public
    constructor Create(aOwner : TComponent); override;
    property Index : Integer read FIndex write SetIndex;
  end;

implementation

uses
  SysUtils;

constructor TMyButton.Create(aOwner : TComponent);
begin
  inherited Create(aOwner);
  Findex := -1;
end;

procedure TMyButton.SetIndex(Value : Integer);
begin
  if Findex <> Value then Findex := Value;
end;

function TMyButtonList.Add(AObject: TObject): Integer;
begin
  if IndexOf(Aobject) <> -1 then Result := IndexOf(Aobject)
  else
  begin
    Result := inherited Add(AObject);
    if (AObject is TMyButton) then
      (AObject as TMyButton).Caption := Format('Knopf %d', [Result + 1]);
  end;
end;

end.
Angehängte Dateien
Dateityp: zip ButtonObjectList.zip (4,4 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort

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:58 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