Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponentenprogrammierung, Ereignis reagiert nicht


Jakane - Mi 12.06.13 14:49
Titel: Komponentenprogrammierung, Ereignis reagiert nicht
Hallo liebe Delphi-Helfer :)

ich habe mir eine kleine Tabellenkomponente gebaut (mit eurer Hilfe) und habe da eine Stringliste die Filterdaten speichert


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TJTabelle = class(TCustomPanel)
  private
    FFilter: TStringList;
    ...
    procedure SetFilter(Value: TStringList);
    ...
    property Filter: TStringList read FFilter write SetFilter;
    ...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TJTabelle.SetFilter(Value: TStringList);
var
  f : Integer;
  Spalte, Wert : String;
begin
  // Variable initialisieren
  DBZ:= Chr(134);
  FFilter:= Value;
  // Daten filtern
  For f:= 0 to FFilter.Count - 1 do
  begin
    ...
  end;
end;


Jetzt füge ich dieser Liste eine Zeile hinzu, um meine Tabelle darauf filtern zu lassen, aber die Prozedur in der Komponente reagiert da gar nicht drauf :(
Also, der Debugger springt nichtmal auf die DBZ-Zuweissung


Delphi-Quelltext
1:
  tabBedingung.Filter.Add('Bedingungstyp: ' Bedingungsart);                    


Verrät mir jemand was ich falsch mache? ^^

Danke


jasocul - Mi 12.06.13 16:10

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Hallo liebe Delphi-Helfer :)

Jetzt füge ich dieser Liste eine Zeile hinzu, um meine Tabelle darauf filtern zu lassen, aber die Prozedur in der Komponente reagiert da gar nicht drauf :(


Also, wenn ich es richtig sehe, ist deine Property vom Typ TStringList. Du müsstest dieser eine neue StringList zuweisen, damit der Setter ausgelöst wird.
Das hinzufügen einer Zeile zu der existierenden StringList hat damit nichts zu tun und kann daher deinen Setter nicht aktivieren.

Habs nur auf die schnelle überflogen, aber ich denke, dass das dein Problem ist.


WasWeißDennIch - Mi 12.06.13 16:33

Ist es wirklich notwendig, dass man die Stringliste von außen ansprechen kann? Vielleicht könnte man auch darüber nachdenken, die Liste intern zu erzeugen und nur indirekten Zugriff über Methoden (AddFilter, DeleteFilter, ClearFilter etc.) zuzulassen.


jaenicke - Mi 12.06.13 17:16

Wenn eine Stringliste von außen zugewiesen wird, sollte nur der Inhalt daraus benutzt werden (FFilter.Assign(Value);), aber die Liste nicht selbst benutzt werden. Das gibt dann ganz hässliche Fehler, wenn der User draußen die Liste selbst (korrekt) freigibt...

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Ist es wirklich notwendig, dass man die Stringliste von außen ansprechen kann? Vielleicht könnte man auch darüber nachdenken, die Liste intern zu erzeugen und nur indirekten Zugriff über Methoden (AddFilter, DeleteFilter, ClearFilter etc.) zuzulassen.
Autschn, sowas macht man doch nicht.
Eine Stringlist hat ein OnChange, das kann man verwenden um bei einer Änderung etwas zu machen.


WasWeißDennIch - Mi 12.06.13 17:51

Und was hat das Eine mit dem Anderen zu tun? Wenn ich keine Notwendigkeit sehe, die Liste nach außen verfügbar zu machen, dann tu ich das auch nicht.


jaenicke - Mi 12.06.13 20:38

Da eine TStringList bereits die genannten Methoden hat, macht es keinen Sinn noch einmal welche zu schreiben, die darauf einerseits weiterleiten und andererseits dann auch noch manuell einzeln die Änderung weitergeben...


WasWeißDennIch - Fr 14.06.13 18:44

Das ist Deine Meinung, ich behalte mir trotzdem eine eigene vor, wenn' s recht ist.