Autor Beitrag
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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:

ausblenden 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
  //Col und Row Position lesen
  StringGrid1.MouseToCell(X, Y, ACol, ARow);
  //Wenn im gültigen Bereich, zeige Hint
  if (ACol <> -1) and (ARow <> -1) then
    StringGrid.Hint := StringGrid.Cells[ACol, ARow];
  // Aktualisierung des Hints
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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.. :oops:
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 18.09.05 22:46 
Hallo,
user profile iconAlpha_Wolf hat folgendes geschrieben:
@Lannes

Was meinst du in dem Fall mit organisiert?


wie liegen die Daten vor, die Du laut deinem ersten Beitrag:
user profile iconAlpha_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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mo 19.09.05 10:11 
Hallo,
user profile iconAlpha_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 Suche in: Delphi-Forum, Delphi-Library PROPERTYEDITOR beschäftigen müssen.

user profile iconAlpha_Wolf hat folgendes geschrieben:
Mein Problem ist jetzt noch wie ich zu jeder Cell unterschiedliche Hints ausgeben kann.
:gruebel: Dein Code in dem ersten Beitrag gibt Dir doch unterschiedliche Hints aus.

user profile iconAlpha_Wolf hat folgendes geschrieben:
Weil das hier find ich nicht das wahre.. sollte doch irgendwie mit einer Zeile gehen oder?
ausblenden 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:
ausblenden volle Höhe Delphi-Quelltext
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:
//...
//globale variable  
var MyHintArr : Array [0..2,0..2] of String;  
//... 
//spezielle Hints anlegen 
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyHintArr[1,0] := 'in der ersten Spalte bitte...';
  MyHintArr[2,0] := 'in der zweiten Spalte bitte...';
end;
//...
//Hints anzeigen  
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//sonst gibt es Zugriffsverletzungen
    begin
    if MyHintArr[ACol, ARow] <> '' then//spezieller Hint vorhanden
      StringGrid1.Hint := MyHintArr[ACol, ARow]
      else//sonst nimm String aus der Zelle 
      StringGrid1.Hint := StringGrid1.Cells[ACol, ARow];
    if (ACol <> LastCol) or (ARow <> LastRow) then
    begin
      Application.CancelHint;
      LastCol := ACol;
      LastRow := ARow;
    end;
  end;
end;

user profile iconAlpha_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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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^^

ausblenden volle Höhe Delphi-Quelltext
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);

  // Zuweisung des Hinttextes über einen Einzeiler
  SetHint(2, 2, 'TestText auf: 2.2');
end;

//*************************************************************************
procedure TForm1.StringGrid1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var  
  ACol, ARow: Integer;
begin
  //Col und Row Position lesen 
  StringGrid1.MouseToCell(X, Y, ACol, ARow);
  //Wenn im gültigen Bereich, zeige Hint 
  if (ACol <> -1) and  (ARow <> -1) then begin
    // Vermeidung von Exception mit Prüfung auf ''
    if SetHintArr[ACol, ARow] <> '' then begin
      // Hint wird angezeigt..
      StringGrid1.Hint := SetHintArr[ACol, ARow]
    end else begin
      // ..sonst wird kein Hint angezeigt
      Application.CancelHint;
    end;
    // Aktualisierung des Hints 
    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
  // Hinttext wird ins Array geschrieben 
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-Quelltext
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;
  // Holt sich anhand der Koordinaten die Spalte und Zeile des Grids
  StringGrid1.MouseToCell(X, Y, ACol, ARow);

  // Prüfung ob überhaupt ein CellHint bestimmt wurde
  if CellHintList.Count <> -1 then begin
    // Prüfung ob außerhalb des Col and Row Bereichs
    if (ACol <> -1) and  (ARow <> -1) then begin
      // Liste wird durchsucht
      for lCounter := 0 to CellHintList.Count -1 do  begin
        // Wenn noch nichts gefunden wurde weiter...(lFound = false)
        if not lFound then begin
          // Zweisung des Zählers der for Schleife dieser dient dem ItemCount
          CellHint := CellHintList.Items[lCounter];
          // Prüfung ob Spalte und Zeile mit dem Eintrag der Liste übereinstimmen
          if (CellHint^.Col = ACol) and (CellHint^.Row = ARow) then begin
            // Stimmen diese überein wird der HintText der Liste dem Hint des Grid übergeben
            StringGrid1.Hint := CellHint^.HintText;
            // Ist positiv also keine weiter Suche nötig
            lFound := true;
          end else begin
            // Wenn Spalte und Zeile nicht übereinstimmen wird der Hinttext des Grids auf '' gesetzt
            StringGrid1.Hint := '';
          end;
        end;
      end;
    end;
  end;
  // Ist die jetzige Spalte oder Zeile ungleich der vorigen Spalte oder Zeile ...
  if (ACol <> LastCol) or (ARow <> LastRow) then begin
    // ...wird die Hint Ausgabe gecancelt und...
    Application.CancelHint;
    // ...die aktuelle Spalte und Zeile übergeben
    LastCol := ACol;
    LastRow := ARow;
  end;
end;

//******************************************************************************
procedure TForm1.SetHint(aCol, aRow: integer; aHintText: string);
begin
  // Neuer Entrag
  New(CellHint);
  with CellHint^ do begin
    Col      := aCol;
    Row      := aRow;
    HintText := aHintText;
  end;

  // Eintrag wird der Liste hinzugefügt
  CellHintList.Add(CellHint);
end;

//******************************************************************************
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CellHintList.Free;
end;



Das ganze wird dann an beliebiger Stelle aufgerufen:

ausblenden 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.