| Autor |
Beitrag |
Alpha_Wolf
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: Fr 16.09.05 12:44
Hallo Community,
folgendes:
Ich bräuchte einen Hint der mir in einem Stringgrid pro Zelle individuelle Daten anzeigt.
Ich habe bereits eine Prozedur die das Anzeigen eines Hints pro Zelle ermöglicht.
Der jetzige Code zeigt allerdings nur den Zelleninhalt als Hint an.
Hier erstmal der Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.StringGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin StringGrid1.MouseToCell(X, Y, ACol, ARow); if (ACol <> -1) and (ARow <> -1) then StringGrid.Hint := StringGrid.Cells[ACol, ARow]; if (ACol <> LastCol) or (ARow <> LastRow) then begin Application.CancelHint; LastCol := ACol; LastRow := ARow; end; end; |
Wie kann ich es im Code realiseren damit ich pro Zelle einen bestimmten Hint anzeigen lassen kann?
Müsste doch eigentlich nur eine String Variable sein die zusätzlich Col und Row Werte beinhaltet.
Nur irgendwie komme ich nicht drauf..
Warum ich das brauche: Ich habe ein relativ großes StringGrid mit vielen kleinen Zellen in denen bestimmte Werte stehen. Hinter diesen Werten hängt allerdings sehr viel und diese Informationen möchte ich gerne anzeigen.
Hoffe ihr könnt mir helfen.
Danke!
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Sa 17.09.05 23:43
Hallo,
wie hast Du die Informationen die als Hint angezeigt werden sollen organisiert?
Du könntest ein Array of String in der größe des StringGrids verwenden, dann ist es einfach:
Delphi-Quelltext 1: 2: 3: 4:
| var MyHintArr : Array [0..10,0..10] of String; StringGrid.Hint := MyHintArr[ACol, ARow]; |
oder Du nutzt die Eigenschaft TStringGrid.Objectsdafür.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Alpha_Wolf 
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: So 18.09.05 18:57
@Lannes
Was meinst du in dem Fall mit organisiert?
Ich hol mir über MouseToCell die Koordinaten bzw. die daraus folgende Col und Row. Als Hint Message wird dann einfach nur das daraus resultierende Ergebnis ausgegeben also der Inhalt der Cell.
Sorry wegen der Umstände.. 
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 18.09.05 19:34
Hallo
irgendwie versteh ich dich nicht. du hast doch einen code, der funktioniert, brauchst ihn doch bloß anpassen. So richtig verstehe ich dein Problem auch nicht. Woher kommt denn deine informationen, die du anzeigen willst? welcehn Bezug gibt es dort zu der Spalte und Zeile?
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 18.09.05 22:46
Hallo,
Alpha_Wolf hat folgendes geschrieben: | @Lannes
Was meinst du in dem Fall mit organisiert? |
wie liegen die Daten vor, die Du laut deinem ersten Beitrag:
Alpha_Wolf hat folgendes geschrieben: | Ich bräuchte einen Hint der mir in einem Stringgrid pro Zelle individuelle Daten anzeigt...
...Hinter diesen Werten hängt allerdings sehr viel und diese Informationen möchte ich gerne anzeigen. |
in einem Hint anzeigen willst.
Hälst Du die Daten in einem Array, einer Stringlist, einer Ini-Datei oder können die Daten aus den Werten des Stringgrids ermittelt werden?
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Alpha_Wolf 
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: Mo 19.09.05 07:13
Achso.. *g* ich glaub ich war gestern nicht ganz da
Die Daten werden einfach händisch eingegeben.. Nur soll das so einfach wie möglich gehalten werden.
Wollte es nämlich als Erweiterung für das StringGrid dazuprogrammieren so das es eine neue Komponente wird.
Mein Problem ist jetzt noch wie ich zu jeder Cell unterschiedliche Hints ausgeben kann.
Weil das hier find ich nicht das wahre.. sollte doch irgendwie mit einer Zeile gehen oder?
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (ACol = 1) and (ARow = 1) then begin StringGrid1.Hint := 'TestAusgabe'; end else begin StringGrid1.Hint := StringGrid1.Cells[ACol, ARow]; end; |
Wollte dann auch ein Flag im Objektinspektor haben wo man diesen CellHint an und ausschalten kann. Weiss jemand wie das geht?
_________________ Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 19.09.05 10:11
Hallo,
Alpha_Wolf hat folgendes geschrieben: | | ...Wollte es nämlich als Erweiterung für das StringGrid dazuprogrammieren so das es eine neue Komponente wird. |
da wirst Du Dich mit der Entwicklung eines PROPERTYEDITOR beschäftigen müssen.
Alpha_Wolf hat folgendes geschrieben: | | Mein Problem ist jetzt noch wie ich zu jeder Cell unterschiedliche Hints ausgeben kann. |  Dein Code in dem ersten Beitrag gibt Dir doch unterschiedliche Hints aus.
Alpha_Wolf hat folgendes geschrieben: | Weil das hier find ich nicht das wahre.. sollte doch irgendwie mit einer Zeile gehen oder?
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (ACol = 1) and (ARow = 1) then begin StringGrid1.Hint := 'TestAusgabe'; end else begin StringGrid1.Hint := StringGrid1.Cells[ACol, ARow]; end; | |
Wie soll das mit einer Zeile gehen, wenn Du abhängig von ACol/ARow einen Hint ausgeben willst?
Nimm Doch ein Array wie ich schon mal vorgeschlagen habe.
Darin belegts Du nur die Felder die bei Bedarf als spezieller Hint angezeigt werden sollen.
Angenommen Du hast ein StringGrid mit 3 Cols und 3 Rows, FixedCols = 1 und FixedRows = 1,
das würde dann im Code in etwa so aussehen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| var MyHintArr : Array [0..2,0..2] of String; procedure TForm1.FormCreate(Sender: TObject); begin MyHintArr[1,0] := 'in der ersten Spalte bitte...'; MyHintArr[2,0] := 'in der zweiten Spalte bitte...'; end; procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin StringGrid1.MouseToCell(X, Y, ACol, ARow); if (ACol <> -1) and (ARow <> -1) then begin if MyHintArr[ACol, ARow] <> '' then StringGrid1.Hint := MyHintArr[ACol, ARow] else StringGrid1.Hint := StringGrid1.Cells[ACol, ARow]; if (ACol <> LastCol) or (ARow <> LastRow) then begin Application.CancelHint; LastCol := ACol; LastRow := ARow; end; end; end; |
Alpha_Wolf hat folgendes geschrieben: |
Wollte dann auch ein Flag im Objektinspektor haben wo man diesen CellHint an und ausschalten kann. Weiss jemand wie das geht? |
Mit der Standard-Eigenschaft ShowHint des StringGrids kannst Du doch die Hints an und ausschalten.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Alpha_Wolf 
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: Mo 19.09.05 12:36
@Lannes
Danke das du dich so mit dem Thema befasst
Ich habs jetzt so gemacht wie dus vorgeschlagen hast.. hatte da einfach zu kompliziert gedacht^^
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| var Form1: TForm1; SetHintArr: array of array of string;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin LastCol := 0; LastRow := 0;
SetLength(SetHintArr, StringGrid1.ColCount, StringGrid1.RowCount);
SetHint(2, 2, 'TestText auf: 2.2'); end;
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin StringGrid1.MouseToCell(X, Y, ACol, ARow); if (ACol <> -1) and (ARow <> -1) then begin if SetHintArr[ACol, ARow] <> '' then begin StringGrid1.Hint := SetHintArr[ACol, ARow] end else begin Application.CancelHint; end; if (ACol <> LastCol) or (ARow <> LastRow) then begin Application.CancelHint; LastCol := ACol; LastRow := ARow; end; end; end;
procedure TForm1.SetHint(aCol, aRow: integer; aHintText: string); begin SetHintArr[aCol,aRow] := aHintText; end; |
Der Aufruf erfolgt nun in einer Zeile mit SetHint.
Ich möchte deswegen noch eine Extra Eigenschaft nehmen weil man entweder zwischen dem normalen ShowHint wechseln soll oder zwischen dem CellHint. Es soll ja schließlich noch möglich sein einen einzigen Hint für das ganze Grid zu nehmen.
Danke für deine Hilfe!
_________________ Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
|
|
Alpha_Wolf 
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: Mi 21.09.05 14:58
Ich habe es jetzt doch ein wenig anders gemacht.. da ich falls ich in einem Grid von 5 x 5 Feldern an der letzter Stelle also an Spalte 5, Zeile 5 einen Hint setzen will durch das Array 5 x 5 Felder anlege. Das ist totale Verschwendung(ich weiss ich bin da etwas streng).
Das ganze funktioniert jetzt mit der TList.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| ...
type TCellHintRecord = record Col: Integer; Row: Integer; HintText: String; end;
...
private CellHintList: TList; CellHint: ^TCellHintRecord;
LastCol: integer; LastRow: integer; procedure SetHint(aCol, aRow: integer; aHintText: string);
...
procedure TForm1.FormCreate(Sender: TObject); begin LastCol := 0; LastRow := 0;
CellHintList := TList.Create; end;
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var ACol, ARow, lCounter: Integer; lFound: boolean; begin lFound := false; StringGrid1.MouseToCell(X, Y, ACol, ARow);
if CellHintList.Count <> -1 then begin if (ACol <> -1) and (ARow <> -1) then begin for lCounter := 0 to CellHintList.Count -1 do begin if not lFound then begin CellHint := CellHintList.Items[lCounter]; if (CellHint^.Col = ACol) and (CellHint^.Row = ARow) then begin StringGrid1.Hint := CellHint^.HintText; lFound := true; end else begin StringGrid1.Hint := ''; end; end; end; end; end; if (ACol <> LastCol) or (ARow <> LastRow) then begin Application.CancelHint; LastCol := ACol; LastRow := ARow; end; end;
procedure TForm1.SetHint(aCol, aRow: integer; aHintText: string); begin New(CellHint); with CellHint^ do begin Col := aCol; Row := aRow; HintText := aHintText; end;
CellHintList.Add(CellHint); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CellHintList.Free; end; |
Das ganze wird dann an beliebiger Stelle aufgerufen:
Delphi-Quelltext 1:
| SetHint(5, 5, 'Mein eigener Zellenabhängiger Hint für Zelle 5.5'); |
Somit werden wirklich nur soviele Einträge angelegt wie man Hints definiert.
_________________ Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
|
|
|