AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Combobox in Stringgrid

Ein Thema von LDericher · begonnen am 18. Aug 2009 · letzter Beitrag vom 19. Aug 2009
Antwort Antwort
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

Combobox in Stringgrid

  Alt 18. Aug 2009, 22:01
Also, das Problem dürfte ja bekannt sein, ne ComboBox in einem StringGrid einzubetten...
Gibt da auch bestimmt mehrere Lösungsvorschläge, aber die SuFu stellt mich hier leider nicht zufrieden...
Ich mache das Ganze erstmal so:

Delphi-Quellcode:
procedure TEditF.SG_SprachenSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
  CRect:TRect;
begin
if(ACol=0)then
  begin
  CRect:=SG_Sprachen.CellRect(ACol, ARow);
  inc(CRect.Left, SG_Sprachen.Left+2);
  inc(CRect.Right, SG_Sprachen.Left+2);
  inc(CRect.Top, SG_Sprachen.Top+2);
  inc(CRect.Bottom, SG_Sprachen.Top+2);
  CB_Sprachen.BoundsRect:=CRect;
  CB_Sprachen.Visible:=true;
  CB_Sprachen.ItemIndex:=integer(SG_Sprachen.Objects[ACol, ARow])-1;
  end else CB_Sprachen.Visible:=false;
end;

procedure TEditF.SG_SprachenExit(Sender: TObject);
begin
if not(ActiveControl=CB_Sprachen)then
  begin
  CB_Sprachen.Visible:=false;
  SG_Sprachen.Selection:=TGridRect(Rect(1, 1, 1, 1));
  end;
end;

procedure TEditF.CB_SprachenExit(Sender: TObject);
begin
if not(ActiveControl=SG_Sprachen)then
  begin
  CB_Sprachen.Visible:=false;
  SG_Sprachen.Selection:=TGridRect(Rect(1, 1, 1, 1));
  end;
end;
Also immer dann, wenn eine Zelle aus Spalte 0 selektiert wird, kommt stattdessen meine CB_Sprachen da rein. wunderbar.
Auch die Kommunikation zwischen Combobox und StringGrid hab ich hingekriegt.
Problematisch wirds nun erst, wenn ich scrollen will: Immer wenn ich in Spalte 0 (per Mausrad oder Tastatur, habe die Balken deaktiviert, ich mag die nicht ) über den Rand hinaus runterscrolle, "rutscht" meine Combobox aus dem StringGrid raus (weil da das CellRect von der nächsten Zelle is).
Wenn ich dann nach oben zurückscrolle, wird die Combobox nich angezeigt, weil die Zelle ja vorher nicht sichtbar ist.

Eigentlich bräuchte ich also eine Art verzögertes StringGrid, das das OnSelectCell-Ereignis erst dann wirft, wenn der Rest aufgebaut ist, sodass man beim Aufruf von CellRect den wirklich AKTUELLEN Wert hat.

Hat jemand eine Idee, wie ich das implementiere?

Danke schonmal!

Euer LDer.

P.S.: Ich will die Combobox ERST DANN sichtbar haben, wenn ich in die Zelle reingehe. Deshalb setze ich die immer wieder um und zeichne sie nicht in die Zelle. Ich lasse mich da aber gern eines Besseren belehren!

P.P.S.: Angehängt habe ich mal ein schnell gecodetes Demoprogramm, das allein zur Reproduktion des Fehlers dient! Hier auch MIT Scrollbars im StringGrid {Mein Originalprogramm enthält vertrauliche Daten, deshalb die abgespeckte Variante}
Angehängte Dateien
Dateityp: zip demo_dp_209.zip (234,7 KB, 35x aufgerufen)
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#2

Re: Combobox in Stringgrid

  Alt 18. Aug 2009, 23:13
Hallo,

ich würde im Ereignis StringGrid.OnTopLeftChanged(wird durch eine Scrollaktion ausgelöst) die Eigenschaft ComboBox.Visible auf False setzen.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Combobox in Stringgrid

  Alt 19. Aug 2009, 10:31
Delphi-Quellcode:
procedure TEditF.SG_SprachenTopLeftChanged(Sender: TObject);
var
  GRect:TGridRect;
begin
CB_Sprachen.Visible:=false;
GRect:=SG_Sprachen.Selection;
if(GRect.Left=0)and(GRect.Right=0)then
  begin
  inc(GRect.Left, 1);
  inc(GRect.Right, 1);
  end;
SG_Sprachen.Selection:=GRect;
end;
Danke für deinen Hinweis, hat echt geholfen!

Der LDer.

P.S.: Jetz stimmt auch mein Nickname! Dnke nochmal an Daniel!
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 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