AGB  ·  Datenschutz  ·  Impressum  







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

Eingaben in Stringgrid begrenzen

Ein Thema von Hansa · begonnen am 28. Nov 2005 · letzter Beitrag vom 29. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Eingaben in Stringgrid begrenzen

  Alt 28. Nov 2005, 22:30
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

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

Re: Eingaben in Stringgrid begrenzen

  Alt 28. Nov 2005, 23:01
mit dem ereignis onsetedittext sollte das gehen!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 01:46
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

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

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 08:17
Hallo,

das kannst Du einem DAU zumuten
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;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 08:53
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 11:38
Thx Lannes, einwandfrei. Ist mir noch nie aufgefallen. @marabu : Dein Code ist wohl von einem SKU, aber warum so kompliziert ?
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 12:39
Hallo Hansa,

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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 18:44
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 19:22
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Eingaben in Stringgrid begrenzen

  Alt 29. Nov 2005, 19:24
Hallo Hansa,

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 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 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:51 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