![]() |
Eingaben in Stringgrid begrenzen
Hi,
bin hier gerade über ein Problemchen gestolpert. Es geht um ein Stringgrid. Beispiel : 3 Spalten. Spalte 1: 10 Zeichen, Spalte 2 20 Zeichen, Spalte 3 10 Zeichen. Ich setze die Breite der Spalten im Programm immer auf die richtige Breite, kann aber soviel eingeben wie ich will. Gebe ich in Spalte 1 10mal Z ein, dann passen die haargenau noch rein, egal welche Schrift oder bei anderen Zeichen. Ich kann nun aber auch 50 eingeben, von denen zwar nur genau 10 sichtbar wären. Das kann zu überflüssigen Fehlern führen. Wo könnte man da ansetzen ? Mir fallen da einige Sachen ein, aber die sind doch recht umständlich. Das geht bestimmt einfacher. Wer hat so was schon gemacht, oder sonstige Tips parat ? |
Re: Eingaben in Stringgrid begrenzen
mit dem ereignis onsetedittext sollte das gehen!
|
Re: Eingaben in Stringgrid begrenzen
Stimmt an die Ereignisse habe ich gar nicht gedacht. 8) Du meinst so ungefähr ?
Delphi-Quellcode:
Damit kriege ich jetzt nur noch so viele Zeichen in eine Zelle, wie auch reinpassen, also so wie gewollt. Der Haken ist aber, daß durch das direkte Zuweisen des neuen Wertes an Cells diese Zelle anscheinend neu gezeichnet wird und auch als selected markiert wird (also blau hinterlegt ist). Und das bedeutet, daß die vorherige Eingabe bei einem weiteren Zeichn zuviel gelöscht wird. Das kann ich so keinem DAU zumuten. :mrgreen:
procedure TfrmNrEin.sgNrSetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String); begin with Sender as TStringGrid do begin if (length (value) * Font.Size) >= ColWidths [ACol] then begin Cells [ACol,ARow] := copy (value,1,length (value)-1); end; end; end; |
Re: Eingaben in Stringgrid begrenzen
Hallo,
das kannst Du einem DAU zumuten :zwinker:
Delphi-Quellcode:
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String); begin with Sender as TStringGrid do begin if Canvas.TextWidth(Value) >= ColWidths[ACol]-5 then begin Cells[ACol,ARow] := copy(Value,1,Length(Value)-1); EditorMode := True; end; end; end; |
Re: Eingaben in Stringgrid begrenzen
Hallo Hansa,
darf ich dir das hier zumuten?
Delphi-Quellcode:
Grüße vom marabu
type
THackedStringGrid = class(TStringGrid); var // Dimensionieren mit SetLength(ColumnMaxLength, StringGrid.ColCount) // Initialisieren mit geeigneten Werten ColumnMaxLength = array of integer; procedure TDemoForm.StringGridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); begin SendMessage(THackedStringGrid(StringGrid).InplaceEditor.Handle, EM_SETLIMITTEXT, ColumnMaxLength[ACol], 0); end; |
Re: Eingaben in Stringgrid begrenzen
Thx Lannes, einwandfrei. :thumb: Ist mir noch nie aufgefallen. @marabu : Dein Code ist wohl von einem SKU, aber warum so kompliziert ?
|
Re: Eingaben in Stringgrid begrenzen
Hallo Hansa,
Zitat:
Freundliche Grüße vom marabu |
Re: Eingaben in Stringgrid begrenzen
Ne, nix Kapito. 8) Wenn das nämlich mit einer Zeile in reinem Delphi zu erledigen ist dann brauche ich keine WinApi Sachen. Außerdem verbiegst Du noch das Standard-StringGrid und dadurch wären meine Forms allesamt unsicher. An zwei Stellen mußte diese Funktionalität eingebaut werden und jetzt reagieren zig Stringgrids gleich.
|
Re: Eingaben in Stringgrid begrenzen
Zitat:
Mfg Frank |
Re: Eingaben in Stringgrid begrenzen
Hallo Hansa,
Zitat:
Aber auch mein Lösungsansatz ist "einzeilig" und darüberhinaus halte ich ihn für professionell. In meinem Beitrag sieht er vielleicht etwas umfangreicher aus, aber nur, weil ich dir auch noch ein Konzept mit an die Hand geben wollte, nach dem du für jede Spalte deines Grids eine definierte maximale Eingabelänge benutzen kannst. Wenn dein Grid in den Edit-Modus geht, dann wird ein Edit-Control vor der aktuellen Zelle schwebend sichtbar gemacht (Inplace-Editor). Ist der Edit-Vorgang abgeschlossen, dann wird der Inplace-Editor wieder unsichtbar gemacht. Wenn das Grid den Text für den Inplace-Editor anfordert, dann klinke ich mich in das Ereignis ein und setze die maximale Eingabelänge entsprechend deinen Vorgaben in dem Array ColumnMaxLength. Prinzipiell machst du das gleiche, wenn du bei einer TEdit-Komponente die Eigenschaft MaxLength setzt. Der Vorteil gegenüber dem durchaus kreativen Ansatz von Lannes ist, dass der Benutzer deines Programms gar nicht erst zuviele Zeichen eingeben kann. Zitat:
Zitat:
Was SKU bedeutet, das willst du mir nicht beibringen? Auch bei den Emoticons habe ich oft keine passende Assoziation. Leicht betrübte Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 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