![]() |
Comboboxen in einem StringGrid
Hi Leute,
ich will in einer bestimmten Spalte eines StringGrids nur Comboboxen anzeigen, die alle die selben Auswahlmöglichkeiten haben. Zum Anzeigen von Objekten im StringGrid hab ich die beiden Themen hier gefunden: ![]() ![]() Allerdings haben sie mir nicht wirklich weitergeholfen, da ich nicht wirklich alles verstanden habe, das dort gesagt wurde. Außerdem zielten diese Beiträge darauf ab, dass dieAnzahl der Zeilen des StringGrids bekannt war. Ich habe allerdings einen dynamischen Grid, der immer, wenn in eine Zeile etwas eingegeben wird eine neu unten dran packt! Wie kann ich jetzt
tia, read you, gordon |
Re: Comboboxen in einem StringGrid
Hallo Gordon,
wir verwenden in unserem Betrieb für solche Dinge das ![]() Greetz alcaeus |
Re: Comboboxen in einem StringGrid
Hab sie mir angeschaut, würde allerdings lieber mit 'nem normalen StringGrid arbeiten. Mein eigentliches Problem ist dabei folgendes:
Wenn ich ein Objekt einer Klasse erstellen will, muss ich es ja auch als Variable deklarieren. WEnn ich jedoch nicht weiß, wie viele Objekte dieser Klasse ich erzeugen will kann ich doch nicht auf gut Dünken erstmal 100 deklarien, falls ich sie brauche? Da muss es doch eine elegantere Lösung geben, doer? :gruebel: |
Re: Comboboxen in einem StringGrid
moin,
speicher die Objekte doch in einem dynamischen Array, das kannst du dann bei Bedarf vergrößern/verkleinern. |
Re: Comboboxen in einem StringGrid
Sorry, hab mich gerade erst in das dynamische Erstellen von Objekten eingearbeitet. Könnteste vieleicht etwas Code zeigen, wie so was mit 'nem dynamischen Array voller Objekte aussehen könnte?
|
Re: Comboboxen in einem StringGrid
Deklaration:
Delphi-Quellcode:
zum Erzeugen:
var ObjektArray: array of tButton;
Delphi-Quellcode:
zum Freigeben:
var i: integer;
begin setlength( ObjektArray, 5 ); For i:=0 to length(ObjektArray)-1 do // dyn. Array laufen von 0 bis length()-1 begin ObjektArray[i] := tButton.Create(Form1); // wobei Form1 natürlich auch ein anderer Besitzer sein kann. ObjektArray[i].Parent := Form1; // Parent gibt an, welches übergeordnete Objekt für das Neuzeichnen verantwortlich ist. Parent muss man nur bei visuellen Objekten setzen. end; end;
Delphi-Quellcode:
var i: integer;
begin For i:=0 to length(ObjektArray)1 do ObjektArray[i].Free; end; |
Re: Comboboxen in einem StringGrid
Danke für die Antwort, werd's morgen mal versuchen zu implementieren :thumb:
|
Re: Comboboxen in einem StringGrid
wenn alle comboboxen dieselbe auswahl haben, dann brauchst du ja nur eine zu erstellen und diese dann anzeigen, wenn der usr auf der entsprechenden spalte steht!
|
Re: Comboboxen in einem StringGrid
Nur, um Misverständnisse auszuschließen:
Ich soll also eine ComboBox erzeugen und die dann in der entsprechenden Spalte immer dann anzeigen , wenn das OnSelectCell-Ereignis auf diese Spalte weist? Warum bin ich da nicht drauf gekommen :wall: Danke für die Idee, werd's heute nachmittag mal ausprobieren!!! |
Re: Comboboxen in einem StringGrid
Zitat:
|
Re: Comboboxen in einem StringGrid
:oops: Richtig, also wenn das OnSelectCell Ereigniss auf eine Zelle der entsprechenden Spalte weist?!
|
Re: Comboboxen in einem StringGrid
dann kannst du das so machen, wie in deinem ersten verweislink im post ganz oben! da habe ich den code gepostet, musst ihn nur im bereich col und row dementsprechend anpassen.
|
Re: Comboboxen in einem StringGrid
Liste der Anhänge anzeigen (Anzahl: 1)
So, hab deinen Code jetzt soweit umgeschrieben, dass er auf meine Bedürfnisse passt, allerdings wird bei mir die ComboBox, die in der Spalte erscheinen soll nicht angezeigt :?
Wenn ich
Delphi-Quellcode:
Setze, wobei Box die ComboBox und Grid der Stringgrid ist, dann erscheint zwar die ComboBox, aber nur in der obersten linken Zelle des Grids. Und da geht sie auch nicht weg. Hab meinen Code mal angehängt. Wäre nett wenn einer von euch sich den mal reinziehen könnte und mir sagen könnte, was falsch ist.
Box.Parent := Grid;
tia, gordon freeman |
Re: Comboboxen in einem StringGrid
du musst das ganze im ondrawcell-ereignis steuern, da sonst die zelle nicht mit der box überzeichnet wird!!!
so sollte es funktionieren!!! und eine bitte: keine doc datei!!!! den code hättest du auch hier posten können!
Delphi-Quellcode:
unit USpielbearbeitung;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, Grids, USpieleigenschaften, IniFiles; type TSpielBearbeitung = class //Objekte BearbeitungsForm : TForm; Grid : TStringgrid; Box : TComboBox; (...) //Variablen zPfad : String; aktCellX : Integer; aktCellY : Integer; //(...) procedure SetRect(rec:Trect); // <-------------------------------------- hier rein private {private-Deklarationen} procedure AktuelleZelleSpeichern(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean); //(...) public {public-Deklarationen} //(...) end; implementation uses UMain; //----------------------------------------------------------------------------// //constructor // - Form erzeugen, konfigurieren, anzeigem // - Menu erzeugen, konfigurieren // - Grid erzeugen, konfigurieren //----------------------------------------------------------------------------// constructor TSpielBearbeitung.create(pPfad : String; Eigenschaften : Boolean); begin //Form -erzeugen, -konfigurieren, -anzeigen BearbeitungsForm := TForm.create(nil); with BearbeitungsForm do begin BorderIcons := BorderIcons - [biMaximize] - [biSystemMenu] - [biMaximize]; width := 500; height := 300; position := poScreencenter; end; //(...) //Grid erzeugen, konfigurieren Grid := TStringgrid.Create(nil); with Grid do begin parent := Bearbeitungsform; fixedcols := 0; fixedrows := 2; Options := Options + [goAlwaysShowEditor] + [goEditing]; OnSelectCell := AktuelleZelleSpeichern; end; //ComboBox erzeugen Box := TComboBox.Create(nil); //Form anzeigen BearbeitungsForm.Show; end; //----------------------------------------------------------------------------// //schliessen // - Spielbearbeitung schließen //----------------------------------------------------------------------------// procedure TSpielBearbeitung.schliessen(Sender:TObject); begin Bearbeitungsform.Close; end; //----------------------------------------------------------------------------// //destructor // - Objekte zerstören //----------------------------------------------------------------------------// destructor TSpielBearbeitung.free(); begin //ComboBox freigeben Box.Free; //Gridfreigeben Grid.Free; //Form freigeben BearbeitungsForm.Free; end; //----------------------------------------------------------------------------// //Aktuelle Zelle Speichern // - Die aktuell gewählte Zelle wird gespeichert // - Wenn es die letzte ist, wird die ComboBox angezeigt //----------------------------------------------------------------------------// {procedure TSpielbearbeitung.AktuelleZelleSpeichern(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);} procedure TfoDBEdit.StringGridOnDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); // <--- anderes ereignis!!!! begin self.aktCellX := Acol; self.aktCellY := Arow; if ACol = Grid.ColCount then begin self.SetRect(Grid.CellRect(ACol,ARow)); Box.visible:=true; // sichtbar end else box.visible:=false; // unsichtbar end; //----------------------------------------------------------------------------// //Der ComboBox die aktuelle Zelle zuweisen //----------------------------------------------------------------------------// procedure TSpielBearbeitung.SetRect(rec:TRect); var r : TRect; begin CopyRect(r,rec); r.BottomRight := Box.Parent.ClientToScreen(Grid.ClienttoScreen(r.BottomRight)); r.TopLeft := Box.Parent.ClienttoScreen(Grid.ClienttoScreen(r.TopLeft)); Box.SetBounds(r.left,r.top,r.right-r.left,r.bottom-r.top); Box.BringToFront; end; end |
Re: Comboboxen in einem StringGrid
Liste der Anhänge anzeigen (Anzahl: 1)
So, hab jetzt alles so geändert, wie beschrieben, allerdings wird bei mir immer noch keine ComboBox angezeigt. Ich lade mal die Unit hoch.
Ein Objekt der Unit wird mit dem Aufruf
Delphi-Quellcode:
erstellt und mit dem Aufruf
(...) := Spielbearbeitung.Create(False);
Delphi-Quellcode:
vernichtet.
(...).Free;
Würde mich freuen, wenn ihr euch das ganze mal anschaut. (Ich weiß, dass es sehr nach Spaghetti-Code aussieht, allerdings ist es mein erstes Programm mit dynamisch erstellten Objekten!!!) tia, gordon |
Re: Comboboxen in einem StringGrid
Hey Leute,
kann sich denn nicht mal einer von euch die Unit anschauen? tia, gordon |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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