Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TAdvStrinGrid mit ComboBox mehrere Spalten füllen (https://www.delphipraxis.net/203763-tadvstringrid-mit-combobox-mehrere-spalten-fuellen.html)

norwegen60 21. Mär 2020 08:47

TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Hallo zusammen,

ich verwende in Delphi XE eine TADVStringrid und möchte nun in dieser folgendes realisieren
  • Spalte 2 und 3 (können auch mehr sein) enthalten Werte, die nicht einzeln editiert werden können. Diese Werte sollen alle über eine ComboBox-Liste ausgewählt werden
  • d.h. egal ob ich Spalte 2 oder 3 anklicke, geht immer unter Spalte 2 eine zweispaltige ComboBox auf
  • Sobald ich einen Eintrag ausgewählt habe, wird der Wert aus Combo-Spalte 1 in Spalte 2 geschrieben und der Wert aus CB 2 in Grid 3
Hat jemand eine Idee, wie sich das mit Bordmitteln der ADV realisieren lässt.
Der Einstiegscode ist
Delphi-Quellcode:
procedure TForm4.bt3Click(Sender: TObject);
var
  dc: TDropDownColumn;
  di: TDropDownItem;
begin
  dc := sg2.GridDropDown.Columns.Add;
  dc.ColumnType := ctText;
  dc := sg2.GridDropDown.Columns.Add;
  dc.ColumnType := ctText;

  di := sg2.GridDropDown.Items.Add;
  di.Text.Add('Text 1');
  di.Text.Add('Add zu Text1');

  di := sg2.GridDropDown.Items.Add;
  di.Text.Add('Text 2');
  di.Text.Add('Add zu Text2');

  di := sg2.GridDropDown.Items.Add;
  di.Text.Add('Text 3');
  di.Text.Add('Add zu Text3');

  sg2.GridDropDown.LookupColumn := 1; // Damit fehlt aber der Text in Splate 3
end;


procedure TForm4.sg2GetEditorType(Sender: TObject; ACol, ARow: Integer; var AEditor: TEditorType);
begin
  if ACol in [2, 3] then
    AEditor := edGridDropDown; // Hier sollte Code hin, der vorgiebt, dass Spalte 2 angewählt
end;

zeras 21. Mär 2020 13:26

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Vielleicht so, wie in der Hilfe beschrieben? Oder verstehe ich da was falsch?

Delphi-Quellcode:
procedure TForm15.gridGetEditorProp(Sender: TObject; ACol, ARow: Integer;
  AEditLink: TEditLink);
begin
  case ACol of
    1:begin
        grid.ClearComboString;
        grid.AddComboString('Berlin');
        grid.AddComboString('Paris');
        grid.AddComboString('London');
        grid.AddComboString('New York');
      end;
    2:begin
        grid.ClearComboString;
        grid.AddComboString('Germany');
        grid.AddComboString('France');
        grid.AddComboString('United Kingdom');
        grid.AddComboString('United States');
      end;
   end;
end;

procedure TForm15.gridGetEditorType(Sender: TObject; ACol, ARow: Integer;
  var AEditor: TEditorType);
begin
  case ACol of
  1: AEditor := edComboList;
  2: AEditor := edComboList;
  end;
end;

norwegen60 21. Mär 2020 13:37

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Dass es so geht, ist mir schon klar.
Was ich aber will, ist dass die Auswahl auf ein mal stattfindet. In deinem Ansatz wählt er zuerst in Col1 Berlin und kann dann in Col2 France auswählen, was natürlich falsch ist
Meine Frage: Egal ob er in Spalte 1 oder 2 klickt, bekommt er eine ComboGrid
Code:
Berlin  Germany
Paris   France
London  United Kingdom
Und je nach Auswahl werden diese beiden zusammengehörenden Begriffet in Spalte 1 und 2 geschrieben

Und damit das ganze schön aussieht, soll die Combo so stehen, dass die Stadt unter Spalte 1 und das Land unter Spalte 2 steht. Das bedeutet, dass die Combo immer linksbündig zu Spalte 1 stehen soll, was bei Klicke in Spalte 1 automatisch gegeben ist. Bei Klick in Spalte würde die Combo aber linksbündig zu Spalte 2 stehen
Darum zwei Möglichkeiten
  1. Click in Spalte 2 wird so umgebogen, dass er wie Klick in Spalte 1 behandelt wird
  2. oder, Combo lässt sich verschieben
Für beide weiß ich aber nicht wie

Und wenn die Combo verschoben, bzw, der Aufruf in Spalte 1 gelenkt wurde, brauche ich noch die Möglicjkeit, die beiden Werte der Combo auszulesen.
Das geht natürlich mit dem in Spalte 1 geschriebenen Wert => dann durch Liste suchen => den Satz ermitteln.
Aber vielleicht gibt es ja einen eleganteren Ansatz

hhcm 21. Mär 2020 17:24

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Ich war mal in einer ähnlichen Situation. Leider finde ich das entsprechende Projekt nicht mehr.
Es lief aber alles auf eine Ableitung "Editlink" hinaus. Also einen eigenen Editor.

Vielleicht hilft das weiter.
Schau dir dazu mal die bereits vorhandenen EditLink Komponenten von TMS an.

norwegen60 21. Mär 2020 21:03

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Nachdem ich gesehen hatte, dass es mit
Delphi-Quellcode:
edGridDropDown
eine einfache Möglichkeit gibt eine Combo mit Spalten zu erstellen, hatte ich eigentlich die Hoffung, dass damit meine Aufgabenstellung auch einfach zu implementieren ist.
Wenn ich da jetzt aber doch was eigenes bauen muss, kann ich auch bei der vorhanden Lösung bleiben. Da wird auf das Grid ein zweites Grid gelegt wird, in dem dann die Auswahlen stehen. Sobald man eine Doppelklickt, wird die ausgewählte Zeile spaltenweise übertragen.

Schade.

hhcm 22. Mär 2020 08:17

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Ich habe nicht gesagt das es nicht anders geht.
Was mit deinem Beispiel funktioniert ist folgendes.

Delphi-Quellcode:
procedure TFormx.sg2EditChange(Sender: TObject; ACol, ARow: Integer; Value: string);
var
  di: TDropDownItem;
  colIndex: Integer;
begin
  if ACol = 2 then
  begin
    sg2.GridDropDown.LookupColumn := 0;
    colIndex := sg2.GridDropDown.Items.IndexInColumn(0, Value);

    if colIndex > -1 then
    begin
      di := sg2.GridDropDown.Items[colIndex];
      sg2.Cells[3, ARow] := di.Text[1];
    end;
  end
  else if ACol = 3 then
  begin
    sg2.GridDropDown.LookupColumn := 1;
    colIndex := sg2.GridDropDown.Items.IndexInColumn(1, Value);

    if colIndex > -1 then
    begin
      di := sg2.GridDropDown.Items[colIndex];
      sg2.Cells[2, ARow] := di.Text[0];
    end;
  end;
end;
Ist als Showcase. Geht bestimmt elleganter.

norwegen60 22. Mär 2020 15:20

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Super, ein Schritt weiter und etwas mehr Verständnis meinerseits.
Delphi-Quellcode:
sg2.GridDropDown.LookupColumn;
sg2.GridDropDown.Items.IndexInColumn(0, Value);
sg2.GridDropDown.Items[colIndex];
waren mir nicht geläufig.

Giebt es noch einen Tip wie ich die Combo immer linksbündig zu Spalte 2 öffnen kann, bzw. meinen Klick in Spalte 3 in einen Klick in Spalte 2 umleite?

Gerd

hhcm 22. Mär 2020 15:47

AW: TAdvStrinGrid mit ComboBox mehrere Spalten füllen
 
Mit ein paar Schaltern unter Navigation und/oder MouseActions sollte folgendes gehen

Delphi-Quellcode:
procedure TFormx.sg2SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  if ACol = 3 then
  begin
    CanSelect := False;
    sg2.EditCell(2, ARow);
  end;
end;


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