Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - mit welcher Komponente bekomme ich das so hin?


daywalker0086 - Fr 01.04.11 00:05
Titel: mit welcher Komponente bekomme ich das so hin?
Hallo Leute,
ich wollte einmal fragen mit welcher Komponente ich die ANzeige so hinbekomme wie im angehängten Bild(schlechte Fotomontage).
Zur Zeit nutze ich eine TStringList, welche mir Messwertnamen und Messwerte anzeigt, welche dynamisch dort eingetragen werden.
Jetzt soll als dritte Spalte eine Checkbox rein, mit der ausgewählt weren kann ob dieser MEsswert später verwendet wird oder nicht.

Welche Komponente statt der Stringlist kann ich nutzen um in ähnlicher tabellarischer Form auch eine Checkbox zu dem jeweiligen Wert zu haben? Mit der Stringlist geht das wohl nicht( oder hab was übersehen).
Die Anzahl der Messwerte leigt immer zwischen 10 und 20, wird also nicht altzu lang.

Für Vorschläge zur Realisierung wäre ich dankbar.

Späte Grüße
Christian


jaenicke - Fr 01.04.11 00:21

Das geht ziemlich einfach mit der Virtual Treeview:
http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38


Narses - Fr 01.04.11 01:06

Moin!

Falls du mit Onboard-Komponenten auskommen willst/musst: das TListView kann auch Checkboxen zu den Einträgen verwalten, einfach mal in die Hilfe schauen. :les: :think: ;)

cu
Narses


Martok - Fr 01.04.11 02:06

user profile icondaywalker0086 hat folgendes geschrieben Zum zitierten Posting springen:
Zur Zeit nutze ich eine TStringList, welche mir Messwertnamen und Messwerte anzeigt, welche dynamisch dort eingetragen werden.
Das glaube ich eher nicht. TStringList ist keine visuelle Komponente, vom Screenshot her tippe ich mal auf TStringGrid.
Von daher böte es sich an, die Checkbox im OnDrawCell selber zu zeichnen und über einen passenden Click-Handler das umschalten zu erledigen.


user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Falls du mit Onboard-Komponenten auskommen willst/musst: das TListView kann auch Checkboxen zu den Einträgen verwalten, einfach mal in die Hilfe schauen. :les: :think: ;)
Aber nur vor/in der ersten Spalte...


daywalker0086 - Di 05.04.11 10:33

Hallo Jungs, nach kurzer Pause bin ich schon soweit das mir die Checkbox in den Zellen
angezeigt wird. Nur leider bleibt diese Checkbox nicht da sondern ist immer nur in der Zelle di egrad den Fokus hat. Wenn ich mit der Tabtaste weiter springe kommt auch die Checkbox mit. Aber die soll ja in jeder Zeile da stehen und das nur in einer bestimmten Spalte, von mir aus auch in der 1.
Das hab ich bis jetzt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if (ACol >= StringGrid1.FixedCols) and (AROw >= StringGrid1.FixedRows)
  and (gdFocused in State) then setRect(Rect)
end;

procedure TForm1.setRect(rec: TRect);
var
r:TRect;
begin
with cb1 do begin
  CopyRect(r, rec);
  r.BottomRight := Parent.ScreenToClient(StringGrid1.ClientToScreen(r.BottomRight));
  r.TopLeft:=Parent.ScreenToClient(StringGrid1.ClientToScreen(r.TopLeft));
  SetBounds(r.Left,r.Top,r.Right-r.Left,r.Bottom-r.Top);
  BringToFront;
  end;
end;


Wo müsst ich noch hinschauen damit die Checkbox immer in einer Zeile bleibt und nur einfach wenn eine neue Zeile erzeugt wird dann auch gleich di edazugehrige Checkbox mit eingefügt wird?


alex517 - Di 05.04.11 10:55

als Beispiel
http://delphi.about.com/od/vclusing/l/aa072203a.htm
alex


jaenicke - Di 05.04.11 11:01

Ich merke schon, mit der VirtualTreeView wäre es dir zu einfach, außerdem sieht das zu gut aus.

Na gut, grundsätzlich bleiben dir nur zwei Möglichkeiten: Entweder du erzeugst für jede Zeile eine eigene ComboBox oder du zeichnest es selbst.
Wie es mit selbst zeichnen geht, steht ja in dem Link von user profile iconalex517 drin.


DonManfred - Di 05.04.11 13:25

Alternativ (kein Boardmittel) gäbe es noch TAdvStringGrid von TMS-Software [http://www.tmssoftware.com/site/advgrid.asp]. checkboxen, Radiobuttons, Dropdowns, uvm geht damit...


daywalker0086 - Di 05.04.11 13:25

Bin nun doch auf Virtual Treeview umgeschwenkt :oops:

Meine Checkboxen hab ich schon und auch die übrigen Spalten :D

Nur wie kann ich jetzt dynamisch den Text der Nodes verändern? also übergeben lassen?

So erstelle ich ein neuen Node und will gleich die erste Spalte beschriften lassen:


Delphi-Quelltext
1:
2:
node:=vst.AddChild(nil);
    vst.Text[node,0]:= Namefilter(Data);

Leider wird der Text nicht übernommen.

Ich hab in meinem Tutorial dies hier gefunden und abgeändert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
begin
case Column of
-1,
0: CellText := Namefilter(Data); //Hier wird der String der angezeigt werden soll übergeben
2: CellText := 'test';  //Zum Testen
else CellText:='';
end;
end;


Das problem ist wenn ich einen neuen Node anlegen werden alle Zeilen der ersten Spalte mit dem neuen Wert überschrieben und nicht nur der neu angelegte Node.

Wo liegt denn schonwieder der Denkfehler?
Später muss ich ja auch nochmal den Text in der zweiten Spalte edititeren können...


jaenicke - Di 05.04.11 13:44

Im Ereignis OnGetText bekommst du den Knoten übergeben. An den musst du auch einen Pointer auf deine Daten angehängt haben beim Erstellen des Knotens. Dann kannst du daraus dynamisch auslesen welcher Text da hin soll.


daywalker0086 - Di 05.04.11 14:13

Hast du ein Beispiel zur Hand? Ich begreifs nicht :cry:

Das geht auch nicht:

Delphi-Quelltext
1:
vst.OnGetText(vst,node,0,ttNormal,'Test');                    


jaenicke - Di 05.04.11 14:42

http://www.delphi-treff.de/tutorials/komponenten/virtualtreeview/den-nodes-daten-hinzufuegen/


daywalker0086 - Di 05.04.11 16:17

So hab nochmal alles durchgeschaut, jetzt funzt es erstmal, nur noch ein weitere kleines Problem.
Ich hab eine extra Spalte wo meine Checkbox angezeigt werden soll.

mit folgenden Code wird die checkbox jedoch in der ersten Spalte angezeigt, obwohl ich für diese Spalte "Checkbox" auf flase stehen habe.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,       //Checkbox anzeigen lassen
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
if Sender.GetNodeLevel(Node) = 0 // nur oberste Ebene
then VST.CheckType[Node] := ctCheckBox;
VST.CheckState[Node] := csunCheckedNormal;
end;


Wie bekomm ich die Checkbox verschoben? konnte leider in dem Tutorial nix dazu finden.


jaenicke - Di 05.04.11 17:09

So direkt geht es auch nur in der ersten Spalte. Ich habe aber ohnehin viel selbst gezeichnet, benutzt habe ich das zum Beispiel in einem Projekt, das ich vor ein paar Jahren auf den Markt bringen wollte, siehe Anhang.

Ich muss zu Hause mal schauen wie das genau ging, auswendig weiß ich das auch nicht alles.