Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eingaben in Stringgrid begrenzen (https://www.delphipraxis.net/57929-eingaben-stringgrid-begrenzen.html)

Hansa 28. Nov 2005 21:30


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 ?

ibp 28. Nov 2005 22:01

Re: Eingaben in Stringgrid begrenzen
 
mit dem ereignis onsetedittext sollte das gehen!

Hansa 29. Nov 2005 00:46

Re: Eingaben in Stringgrid begrenzen
 
Stimmt an die Ereignisse habe ich gar nicht gedacht. 8) Du meinst so ungefähr ?

Delphi-Quellcode:
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;
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:

Lannes 29. Nov 2005 07:17

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;

marabu 29. Nov 2005 07:53

Re: Eingaben in Stringgrid begrenzen
 
Hallo Hansa,

darf ich dir das hier zumuten?

Delphi-Quellcode:
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;
Grüße vom marabu

Hansa 29. Nov 2005 10:38

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 ?

marabu 29. Nov 2005 11:39

Re: Eingaben in Stringgrid begrenzen
 
Hallo Hansa,

Zitat:

Zitat von Hansa
Dein Code ist wohl von einem SKU, aber warum so kompliziert ?

deine Botschaft an mich verstehe ich nicht. Hast du meinen Code überhaupt verstanden?

Freundliche Grüße vom marabu

Hansa 29. Nov 2005 17:44

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.

Keldorn 29. Nov 2005 18:22

Re: Eingaben in Stringgrid begrenzen
 
Zitat:

Zitat von Hansa
An zwei Stellen mußte diese Funktionalität eingebaut werden und jetzt reagieren zig Stringgrids gleich.

wieso reagiern alle Grids gleich? Es wirkt sich doch nur auf das eine "StringGrid" aus, das im Ereignis genannt ist.

Mfg Frank

marabu 29. Nov 2005 18:24

Re: Eingaben in Stringgrid begrenzen
 
Hallo Hansa,

Zitat:

Zitat von Hansa
Wenn das nämlich mit einer Zeile in reinem Delphi zu erledigen ist dann brauche ich keine WinApi Sachen.

du hast eine "reine, einzeilige" Lösung? Dann schäme ich mich, dass ich die nicht kenne.

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 von Hansa
Außerdem verbiegst Du noch das Standard-StringGrid und dadurch wären meine Forms allesamt unsicher.

Ich verbiege da nichts, ich besorge mir nur ein Zugriffsrecht auf das Handle des Inplace-Editors, damit ich dessen "MaxLength" setzen kann.

Zitat:

Zitat von Hansa
An zwei Stellen mußte diese Funktionalität eingebaut werden und jetzt reagieren zig Stringgrids gleich.

Das ist fast unglaublich. Hast du denn die Ereignisbehandlungsroutine an alle deine StringGrids geheftet? Kannst du tun, aber dann musst du auch dafür sorgen, dass stets plausible Werte für "MaxLength" bereit stehen. Mein Array hält ja nur die Werte für ein einziges Grid vor.

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 09:12 Uhr.
Seite 1 von 2  1 2      

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