Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   [LiveBindings, DSharp]binden Feld/Variable<->TEdit (https://www.delphipraxis.net/163356-%5Blivebindings-dsharp%5Dbinden-feld-variable-tedit.html)

Jens01 26. Sep 2011 14:34

[LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Hallo..

gerade beschäftige ich mich mit diesen LiveBindings. Ich möchte gerne meine Felder/ Variablen mit den Controls binden. Also wenn z.B. in einen Edit der Text verändert wird, dann soll sich die Variable gleichzeitig ändern.
Die genannten Komponenten verbinden aber irgendwie nur die Controls untereinander oder Controlls zu Datenbanken.

Gibt es dafür eine Möglichkeit oder mache ich einen gedanklichen Fehler?

Gruss Jens

mquadrat 26. Sep 2011 15:23

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
LiveBindings:

Aktualisier mal deinen Samples-Ordner, da gibt es inzwischen Beispiele für. Für das Szenario: Du brauchst auf dem Form eine BindScope-Komponente. Die musst du dann bei den Bindings als Source eintragen. Im Code setzt du dann BindScope.DataObject auf dein Objekt.


DSharp:

Auch da müsste meiner Meinung nach ein Beispiel dabei sein (Sample5, wenn ich nicht irre).
EDIT: Hier die Variante im Code http://delphisorcery.blogspot.com/20...revisited.html und in einem Posting von Mai steht dann auch was über den IDE Support - hab ich noch nicht ausprobiert

Jens01 26. Sep 2011 16:29

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Also ein entsprechendes LiveBindings-Sample habe ich irgendwie nicht gefunden. Ich habe aber mit dem TBindScope weitergemacht und es funktioniert schon halb.
Auf dem VCL habe ich ein TEdit und ein TButton und folgenden Code:
Delphi-Quellcode:
  TForm1 = class(TForm)
    bndscp1: TBindScope;
    edt1: TEdit;
    bdglst1: TBindingsList;
    bndxprsnedt: TBindExpression;
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  end;

  TTest = class
  public
    s: string;
  end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  ShowMessage(Test.s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test := TTest.Create;
  Test.s := 'xxxyyy';
  bndscp1.DataObject := Test;
end;
SourceExpression ist auf Test.s gesetzt.
In der TEdit wird jetzt korrekt 'xxxyyy' angezeigt. Aber bei Änderung des TEdit.Text ändert sich Test.s nicht.

Da gibt es doch bestimmt eine noch fehlende Einstellung, oder? Ich hatte mit diesem Direction schon rumgespielt, brachte aber nichts.

mquadrat 26. Sep 2011 16:31

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Bei der Binding-Expression kann man auswählen ob das nur von Source zu Component ist oder auch bidirektional.

Jetzt wo du's sagst. Ich meine ich hätte das Beispiel auf Stack Overflow gefunden.

Jens01 26. Sep 2011 16:36

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Bei der Binding-Expression kann man auswählen ob das nur von Source zu Component ist oder auch bidirektional.
Ja, dies Direction habe ich auch auf dirBidirectional gesetzt, es gab aber das gleiche Ergebnis. Ich vermute, dass ich irgendwas vergessen habe.

Stevie 26. Sep 2011 18:23

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
DSharp unterstützt nicht das Binden von Controls an simple Variablen - wird es auch nicht bekommen. Ich sehe auch ehrlich gesagt keinen Sinn darin, an eine Variable zu binden. Machst du allerdings eine Property draus (dann sind wir auch wieder im OOP Land), geht das ohne Problem.

Du bist wie viele andere auch auf eins der größten design fails der LiveBindings reingefallen. Binden allein reicht nicht. Wenn du TBindExpression benutzt, tut sich im Edit garnix von alleine. Daher hab ich in meiner Gegenüberstellung in diese Bereich auch den Punkt an DSharp vergeben. Denn was bringt mir nen Binding, wenn ich hinterher eh das OnChange implementieren muss. :wall: Nur, wenn du TBindLink benutzt, wird im Edit der Observer aktiviert. TBindLink lässt sich aber afaik nicht mit nem simplen TObject Derivat verbinden. Und es führt dazu, dass dein Edit readonly ist, wenn die SourceComponent nicht IEditLink (oder so ähnlich) implementiert.

mquadrat 26. Sep 2011 18:23

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Das Notify im OnChange hast du?

Jens01 26. Sep 2011 19:37

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Das Notify im OnChange hast du?
Das wird es wohl sein. Ich habe mittlerweile auch das Beispiel auf Stackoverflow gefunden.

@Stevie
Ja, irgendwie hatte ich sowas geahnt.
Läßt sich mit DSharp Stringgrids mit Listen verbinden. Ich habe Felder(keine Datenbank) aus Objekten in Listen, die ich zeilenweise darstelle und dort auch änderbar sind.

Stevie 26. Sep 2011 20:45

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Zitat von Jens01 (Beitrag 1126807)
@Stevie
Ja, irgendwie hatte ich sowas geahnt.
Läßt sich mit DSharp Stringgrids mit Listen verbinden. Ich habe Felder(keine Datenbank) aus Objekten in Listen, die ich zeilenweise darstelle und dort auch änderbar sind.

Unterstützte gridähnliche Controls bisher sind nur TListView und TVirtualTreeView. TStringGrid steht aber auf der Todo Liste.

Jens01 26. Sep 2011 20:57

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Also guck ich mir das Ganze noch eine Zeit lang aus einem gewissen Abstand an.8-)

mquadrat 27. Sep 2011 08:38

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Letztendlich müsste man ja "nur" ein passendes DataTemplate schreiben. Leider habe ich vor der it-sa in Nürnberg keine Zeit, sonst würd ich einen schreiben :cry:

Stevie 27. Sep 2011 09:33

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Zitat von mquadrat (Beitrag 1126872)
Letztendlich müsste man ja "nur" ein passendes DataTemplate schreiben. Leider habe ich vor der it-sa in Nürnberg keine Zeit, sonst würd ich einen schreiben :cry:

Kann man machen, wenn man dem DataTemplate das Grid bekannt macht. Ist aber ein bisschen am Konzept vorbei getrickst. Der vorgesehene Weg ist, ein passenden CollectionViewAdapter zu schreiben. Ich werd das mal in den nächsten Tagen angehen, soweit ich Zeit habe, da es ja offensichtlich Bedarf für dieses Feature gibt.

mquadrat 27. Sep 2011 11:34

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Ahh stimmt, hatte das gerade durcheinander geworfen.

Jens01 27. Sep 2011 14:47

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Ich werd das mal in den nächsten Tagen angehen, soweit ich Zeit habe, da es ja offensichtlich Bedarf für dieses Feature gibt.
Ich wäre Ersttester!

Stevie 27. Sep 2011 20:37

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Zitat von Jens01 (Beitrag 1127035)
Zitat:

Ich werd das mal in den nächsten Tagen angehen, soweit ich Zeit habe, da es ja offensichtlich Bedarf für dieses Feature gibt.
Ich wäre Ersttester!

Viel Spaß - (r137)

Jens01 27. Sep 2011 20:52

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
:shock:
Morgen, okay!?

Jens01 28. Sep 2011 12:06

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Du mußt mir dabei etwas helfen.
Ich möchte Felder von Objekten an bestimmte Cells eines Stringgrid binden.
Wenn ich mir da so ein Beispiel von Dir nehme:
Delphi-Quellcode:
TBinding.Create(FSettings, 'Caption', MainForm, 'Caption');
Dann wäre "MainForm" in meinem Fall das Stringgrid, aber wie spreche ich die Zelle an?
Oder ganz anders..? :(

mquadrat 28. Sep 2011 12:32

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Schau dir mal das Beispiel mit der Liste an (ich meine das wäre Sample05).

Jens01 28. Sep 2011 12:59

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Schau dir mal das Beispiel mit der Liste an (ich meine das wäre Sample05).
Ja, das ist wohl das Beispiel dafür. Das sieht aber nicht unkompliziert aus...
Guck ich mir heute Abend an.

Stevie 28. Sep 2011 15:14

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Im VirtualTreeviewSample wird gezeigt, wie es benutzt wird (jaja, ich weiß, ich muss die Samples mal reorganisieren ;))

stahli 20. Dez 2012 15:32

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Zitat von Stevie (Beitrag 1126895)
Zitat:

Zitat von mquadrat (Beitrag 1126872)
Letztendlich müsste man ja "nur" ein passendes DataTemplate schreiben. Leider habe ich vor der it-sa in Nürnberg keine Zeit, sonst würd ich einen schreiben :cry:

Kann man machen, wenn man dem DataTemplate das Grid bekannt macht. Ist aber ein bisschen am Konzept vorbei getrickst. Der vorgesehene Weg ist, ein passenden CollectionViewAdapter zu schreiben. Ich werd das mal in den nächsten Tagen angehen, soweit ich Zeit habe, da es ja offensichtlich Bedarf für dieses Feature gibt.

Was sind denn (grob beschrieben) DataTemplate und CollectionViewAdapter (bzw. deren Unterschiede)?

Stevie 7. Jan 2013 12:37

AW: [LiveBindings, DSharp]binden Feld/Variable<->TEdit
 
Zitat:

Zitat von stahli (Beitrag 1196273)
Was sind denn (grob beschrieben) DataTemplate und CollectionViewAdapter (bzw. deren Unterschiede)?

Ein DataTemplate steuert, was und wie ein Element angezeigt wird, u.a.:

- angezeigter Text,
- selber zeichnen (ist dann eine spezielle Subklasse vom TDataTemplate)
- Icon vor der Zeile, Zelle
- Steuerung der hierarchischen Struktur (hat das Item Unterelemente, wenn ja, wie viele)

Der CollectionViewAdapter ist die Schnittstelle zwischen CollectionView und dem Control bzw Teile des Controls (z.B. zu sehen in der Unit DSharp.Bindings.CollectionView.VCLAdapters.

Vermutlich aufkommende Frage: Was ist denn CollectionView? Das ist die abstrakte Schicht, über die man die Anzeige einer Collection steuern kann, ohne dass man wissen muss, was das genau ist (ListBox, StringGrid, TreeView, ...).


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 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