AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

tStringGrid und In-Place-Editor Problem

Ein Thema von BoolString · begonnen am 1. Aug 2010 · letzter Beitrag vom 18. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2   
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
68 Beiträge
 
RAD-Studio 2009 Pro
 
#1

tStringGrid und In-Place-Editor Problem

  Alt 1. Aug 2010, 23:36
Moin!

Ich sitze derzeit daran und arbeite ein altes Projekt ein wenig auf. Ein wichtiger Abschnitt darin ist ein Dateneditorformular.

Meine eigentlichen Daten befinden sich alle in eine eigene Klasse gekapselt und werden zentral von einem Datenmanager verwaltet. In dem Fromular für die Editierung der Daten befindet sich ein StringGrid, welches ich nutze um die Daten darzustellen und editieren zu lassen. Neben Zahlen können auch Strings auftreten. Da bei den Zahlen teilweise viele Nachkommastellen auftreten würde ich gerne 2 StringGrids verwenden. Das eine beinhaltet die tatsächlichen Werte und Strings (die ich benötige um eine nötige numerische Genauigkeit zu erreichen). Das andere stellt Zahlen (nach Einstellung) auf eine definierte Anzahl an Nachkommastellen dar (im OnDrawCell nach den Werten aus dem exakten Grid)). Der Nutzer kann zwischen den beiden StringGrids umschalten (Visible Property über eine Checkbox realisiert). Wenn ich das Formular schließe, werden die aktuellen Werte aus dem exakt anzeigenden StringGrid an den Datenmanager zurückübermittelt. Das Ganze habe ich über ein filigranes Machwerk bewerkstelligt, welches mir ermöglicht sowohl Row/Col-Movings, Cell-Selection, Row/Col Selection und Editing Funktionalitäten bereitzustellen, ohne dass der Nutzer irgendwas umschalten muss.

Nun habe ich das folgende Problem:
Wenn ich im StringGrid mit den gerundeten Zahlen editiere (gilt andersrum genauso), dann kann ich für die Editierung der Zelle den genauen Inhalt über OnGetEditText aus dem exakten StringGrid holen und anzeigen. Das Problem liegt aber darin, wie ich den Wert nach abschließender Editierung in beide StringGrids bekomme, da mir ansonsten Inkohärenzen entstehen (wie gesagt, die Darstellung der gerundeten Zahlen im entsprechenden Grid wird im OnDraw gemacht). Mir fehlt jetzt so etwas wie eine OnExit Property des In-Place-Editors, von wo aus ich den Wert nach der Bearbeitung in beide StringGrids schreiben kann. OnSetEditText scheidet hier leider aus, da es den Wert immer wieder aktualisiert und neu markiert, da dann auch gleich wieder OnGetEditText aufgerufen wird. Zudem kann es dann auch noch sein, daß der Nutzer die Maus verschoben hat, so daß der Zeiger nicht mehr über einem Feld steht welches ich für Zelleingabe zulasse. In dem Fall wird die Editierung der Zelle nämlich komplett abgebrochen.

Ich bräuchte so etwas wie:
Eine OnExit Funktion des In-Place Editors, der mir in der Prozedur die Koordinaten im Grid mitliefert, damit ich den neuen Wert in beide Grids schreiben kann. Alternativ könnte man sicherlich auch ein normales tEdit da drüber legen. Die Frage ist nur wie und wie realisiere ich das dann. Kann man da nicht eine Trick/Cracker Klasse für nutzen, die die gewünschte Funktionalität für die StringGrids jetzt noch nachträglich bereitstellt? Wenn der Nutzer die Tab Taste drückt wäre es schön, wenn der Editor gleich in der nächsten logischen Reihung erneut aufgerufen wird. Dazu kann man doch dann sicherlich das TCMDialogKey Event abfangen und mit ActiveControl auf den entsprechenden Editor vergleichen, oder?


Die Frage ist nur WIE???
Vielleicht kann mir jemand helfen; momentan stehe ich ziemlich auf dem Schlauch. Ich schätze, daß man für ein normales StringGrid irgendwie den In-Place-Editor verbiegen kann oder durch eine andere Funktion ersetzt. Mir fehlt da derzeit allerdings komplett der Überblick. Ich habe schon viel im Netz gesucht und noch nicht wirklich was gefunden, was mir direkt nützt. Die Hilfe von meinem D2009 bringt mich derzeit auch nicht weiter. Zudem kommt noch, daß ich mehr auf der Numerikseite zu Hause bin als im Komponentendesign.

Beste Grüße und herzlichen Dank

Jan
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
952 Beiträge
 
Delphi 2007 Professional
 
#2

AW: tStringGrid und In-Place-Editor Problem

  Alt 2. Aug 2010, 08:28
Problematisch finde ich deinen Ansatz die Daten im Grid zu halten.
Eigentlich benötigst du doch nur ein Grid (das die Daten je nach Einstellung in unterschiedlicher Form darstellt) und Datenobjekte die die genauen Daten beinhalten. Ich würde mit TDrawGrid und TObjectList mit selbst definierten Zeilenobjekten arbeiten. Warum reicht dir OnGetText und OnSetText nicht aus, du kannst doch in beiden Events auf Col und Row des Grids zugreifen? Und was hat die gerade bearbeitete Zelle mit der Maus zu tun?
Code:
OnDrawCell    Daten in der aktuell gewünschten Weise darstellen
OnGetEditText Daten für Row und Col vor Bearbeitung bereitstellen, oder mit Abort abbrechen
OnSetEditText Daten für Row und Col nach Bearbeitung entgegennehmen oder verwerfen
OnKeyDown     eventuell Steuerung von Col und Row (siehe auch EditorMode)
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
68 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: tStringGrid und In-Place-Editor Problem

  Alt 2. Aug 2010, 22:23
Du hast selbstverständlich Recht, das die Datenhaltung im Grid nicht unbedingt die beste Wahl ist. Im Normalfall befinden sich die Matritzen und Tabellen auch jeweils in einem eigenen Objekt. Der Editor ist nur dazu da, damit man die Werte kontrollieren kann und gegebenenfalls leicht korrigieren. Dabei stört mich halt das Problem der Nachkommastellen. Ich habe diese Form gewählt, weil ich dann nicht ein extra Datenhaltungsmodell schaffen muss, welches zusammen mit dem Stringgrid aktualisiert wird (z.B. Spalten verschieben).

Die Maus spielt eine Rolle in der Art, daß sie die Parameter des Options-Set des StringGrids steuert. Damit wird die Unterscheidung realisiert zwischen Spalten/Zeilenverschieben, Indexfeldern, Zeilen/Spaltentiteln und Datenfeldern, die sich alle ein wenig unterscheiden. Befinde ich mich über einer Datenzelle ist natürlich goEditing im Set. Hole ich jetzt mit OnGetEditText/OnSetEditText eine Editierung starte, passiert (meiner Überlegung nach) folgendes:
- String wird geholt und im In-Place-Editor dargestellt. - Der erste Tastendruck löst SetText aus. - Der Text wird aktualisiert und neu bereitgestellt (dann aber wieder komplett markiert). - MouseOver wird aktualisiert und wenn die jetzt nicht mehr über einer bearbeitbaren Zelle steht, dann fehlt goEditing und Editierung wird kalt abgebrochen....


Formulieren wir das ursprüngliche Problem doch mal anders:
Wie setze ich einen Editor auf eine StringGridzelle und bekomme den Wert dieses Editors zurück, NACHDEM der Nutzer den Editor beendet hat (z.B. Return drückt, eine Zelle weiter 'tabt', oder ESC drückt).


Jan



PS: Schönen Dank, aber die angehängten Properties kenne ich bereits. Arbeite seit gut 15 Jahren mit StringGrids in Delphi (bzw. seinen Vorläufern ) Allerdings habe ich mich noch nie um das hier angesprochene Problem kümmern dürfen/wollen/müssen....
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.437 Beiträge
 
Delphi 7 Architect
 
#4

AW: tStringGrid und In-Place-Editor Problem

  Alt 3. Aug 2010, 09:05
Hi,

ich war auch mal am leidigen In-Place-Editoren Problem programmieren, bis ich bemerkt habe, dass der Kosten-Nutzen Faktor eher ungünstig lag.
Meine Lösung war dann eine fertige zu kaufen. TAdvStringGrid von TMS Software gibt es für ca. 100 EUR. (ich kann empfehlen TMS Component Pack ca 200 EUR)
Für Probleme gibt es einen sehr guten Support.

Grüße

ibp
  Mit Zitat antworten Zitat
plusplus

Registriert seit: 30. Jul 2010
106 Beiträge
 
Delphi 2009 Architect
 
#5

AW: tStringGrid und In-Place-Editor Problem

  Alt 3. Aug 2010, 11:37
Ich wurde im hintergrund ein nicht sichbares TEdit control gebrauchen und wenn der mouse ueber die zeile kommt bringst du es nach vorn um zu bearbeiten. Da hast du auch einen OnExit event.

Ich personlich halte nicht viel von dem eingebautem InplaceEdit, wenn ich StringGrid gebrauche mache ich immer diesen trick.

Ich hoffe dass hilft.
Grid Computing made simple - http://xerocoder.com
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
68 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: tStringGrid und In-Place-Editor Problem

  Alt 7. Aug 2010, 13:13
Sorry, daß meine Antwort so lange gedauerthat. Hab im schwedischen Nirgendwo gesessen und ein sporadisch aufploppends WLAN genutzt. Bin aber inzwischen wieder da...


@ibp
Danke für den Hinweis. Ich bin selbst schon einmal über auf den Link gestoßen; habe aber ob der Vielzahl von käuflich erwerbbaren StringGrid Komponenten damals etwas den Überblick verloren. Inzwischen habe ich mir das Manual runtergeladen und bin doch von der Mächtigkeit etwas angetan. Habe die gut 200 Seiten zwar bisher nur überflogen. Aber auf lange Sicht scheint das eine Option zu sein.
Mir geht es hier aber auch ein wenig darum zu lernen wie man diesen verflixten InplaceEditor richtig anspricht. Ich verstehe solche Sachen ehrlich gesagt am Besten, wenn ich Code dazu habe; bin inzwischen etwas eingerostet und begreife an Hand der aufgezeigten Herangehensweise dann doch etwas schneller

@plusplus
Ganz klar ist mir noch nicht wie du das Edit ansprichst. Ich denke mal, daß du nicht so eine oben im Formular gelagerte Eingabezeile wie unter Excel meinst. Bohrst du dann das Create auf und schickst ein Destroy beim onExit los? Hast du da evtl. ein paar Zeilen Quelltext?


Ich habe gerade (relativ vergeblich) versucht mit einem eigenen (KlassenCracker-)StringGrid eine entsprechende Funktionalität zu erzeugen. Aber irgendwie brachte das auch nicht den gewünschten Erfolg. Zudem ist es auch ein kleines Monster geworden:

Delphi-Quellcode:
type
 tTrickGrid = class;
 tExitCellEvent = Procedure (Sender: tTrickGrid; aCol, aRow: Integer; const edittext: string) of object;


  tTrickGrid = class (tStringGrid)
  private
    FExitCell : TExitCellEvent;
  protected
    Function CreateEditor: TInplaceEdit; override;
    Procedure ExitCell (const edittext: String; aCol, aRow: Integer); virtual;
  public
    property InplaceEditor;
  published
    property OnExitCell: TExitCellEvent read FExitCell write FExitCell;
  end;


  TForm1 = class (TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
      var Value: string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


type

  tTrickInplaceEditor = class (tInplaceEdit)
  private
    FLastCol, FLastRow: Integer;
    procedure WMKillFocus(var msg: TMessage); message WM_KILLFOCUS;
    procedure WMSetFocus(var msg: TMessage); message WM_SETFOCUS;
  public
  end;


// ----------------------------------------------------------tTrickInplaceEditor

procedure tTrickInplaceEditor.WMKillFocus (Var msg: TMessage);
begin
  tTrickGrid(Grid).ExitCell (Text, FLastCol, FLastRow);
  inherited;
end;


procedure tTrickInplaceEditor.WMSetFocus (Var msg: TMessage);
begin
  FLastCol := tTrickGrid (Grid).Col;
  FLastRow := tTrickGrid (Grid).Row;
  inherited;
end;


// -------------------------------------------------------------------tTrickGrid
Function tTrickGrid.CreateEditor: tInplaceEdit;
begin
  result := tTrickInplaceEditor.Create (Self);

end;


procedure tTrickGrid.ExitCell (Const EditText: String; aCol, aRow: Integer);
begin
  If Assigned (fExitCell) THen
  Begin
    fExitCell (Self, aCol, aRow, EditText);
    fExitCell (Self, 0, 0, EditText);
  end;
end;

// -------------------------------------------------------------------StringGrid


procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
// tTrickGrid (StringGrid1).SetEditText (aCol, aRow, Value);
// tTrickGrid (StringGrid1).CreateEditor;
end;


Vielleicht kann mir ja jemand hierbei noch einmal erklären, wie ich meinen Gedankengang sortieren müsste, damit so etwas funktioniert...

Beste Grüße

Jan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
27.597 Beiträge
 
Delphi XE3 Professional
 
#7

AW: tStringGrid und In-Place-Editor Problem

  Alt 7. Aug 2010, 13:20
Wie wäre es mit Delphi-Referenz durchsuchenOnGetEditText und Delphi-Referenz durchsuchenOnSetEditText?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
68 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: tStringGrid und In-Place-Editor Problem

  Alt 7. Aug 2010, 13:42
Hallo himitsu,

mein Problem ist, daß ich gerne in 2 StringGrids den gleichen Inhalt haben möchte. Eines ist relevant, eines ist eine reduzierte Darstellung (gerundete Werte). Wenn ich mit GetText den Zellinhalt aus dem relevanten Grid für den InplaceEdit hole, habe ich das Problem, daß ich mit dem SetText keine vernünftige Darstellung hinbekomme. Der Text wird in den Zellen überschrieben, neu markiert, und der Editor springt wieder an und holt aus dem einen Grid den dort stehenden Wert. Wenn man im anderen Grid aber die Eingabe gemacht hat, dann geht diese verloren. Zudem habe ich noch einige Steuerungen bezüglich der Position des Mauszeigers, wodurch es sein kann, daß goEditing nicht mehr in Options enthalten ist. Siehe auch mein 2. Posting...

Jan
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.437 Beiträge
 
Delphi 7 Architect
 
#9

AW: tStringGrid und In-Place-Editor Problem

  Alt 7. Aug 2010, 18:52
hast du schon mal bei den Schweizern nachgesehen?

Bespiele für Inplace und StringGrid...

einen TMemo mit einer StringGrid-Zelle kombinieren
...eine Combobox als InPlace Editor in einem StringGrid verwenden?
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
186 Beiträge
 
Delphi XE5 Professional
 
#10

AW: tStringGrid und In-Place-Editor Problem

  Alt 8. Aug 2010, 23:26
Hallo Jan,

ich würde mir eine eigene StringGridklasse von TStringGrid ableiten und erstmal die Funktionalität für die genaue und gerundete Darstellung einbauen.

Dann brauchst Du schonmal das zweite StringGrid nicht mehr.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf