Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringGrid Spalte mit Namen "ansprechen" (https://www.delphipraxis.net/180352-stringgrid-spalte-mit-namen-ansprechen.html)

Nils S. 13. Mai 2014 18:57

StringGrid Spalte mit Namen "ansprechen"
 
Guten Tag zusammen.
Ich arbeite momentan mit einem StringGrid, welches mit Daten aus einer Datenbank gefüllt wird.
Daher möchte ich zum Beispiel die Header der Spalten anders beschriften.

Das kann ich ja beispielsweise so machen:
Delphi-Quellcode:
StringGrid1.Columns[0].Header := 'Nachname'


Aber ist auch so etwas wie:
Delphi-Quellcode:
StringGrid1.Columns['LAST_NAME'].Header := 'Nachname'

möglich?

Die Spalten des Grids sollen für den Nutzer nämlich verschiebbar sein, was zum Beispiel ein Auslesen von Zellen, anhand eines Spaltenindexes, unmöglich macht.
Oder kann ich, wenn die oben gezeigte Überlegung nicht funktioniert, anhand des Spaltennamens den Index herausfinden?

Ich verwende Firemonkey mit XE5.

Danke schonmal im Voraus.

Volker Z. 13. Mai 2014 21:10

AW: StringGrid Spalte mit Namen "ansprechen"
 
Hallo,

Zitat:

Zitat von Nils S. (Beitrag 1258798)
[...]

Aber ist auch so etwas wie:
Delphi-Quellcode:
StringGrid1.Columns['LAST_NAME'].Header := 'Nachname'

möglich?

AFAIK gibt es das so nicht. Aber mit etwas Handarbeit ist das doch schnell zusammengebastelt, z. B. so:
Delphi-Quellcode:
type
  TStringGridHelper = class helper for TStringGrid
  private
    function GetColumnByName (Name : TComponentName) : TColumn;
  public
    property ColumnByName [Name : TComponentName] : TColumn read GetColumnByName;
  end;

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    LastName: TStringColumn;
    StringColumn2: TStringColumn;
    StringColumn3: TStringColumn;
    StringColumn4: TStringColumn;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

function TStringGridHelper.GetColumnByName (Name : TComponentName) : TColumn;
var
  i : Integer;
  c : TColumn;
begin
  Result := nil;

  for i := 0 to ColumnCount - 1 do
    begin
      c := Columns [i];
      if c.Name = Name then
        begin
          Result := c;
          Break
        end
    end;

  if not Assigned (Result) then
    raise Exception.Create ('Fehlermeldung')
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.ColumnByName ['LastName'].Header := 'Nachname'
end;
Gruß

Nils S. 14. Mai 2014 12:28

AW: StringGrid Spalte mit Namen "ansprechen"
 
Wenn man die Ahnung hat, dann ist es natürlich nur ein bisschen Handarbeit.
Leider bin ich da noch nicht so fit.

Vielen Dank schonmal dafür.
Ich schaue mir das mal in Ruhe an und werde mich dann bestimmt nochmal mit ein, zwei Fragen melden. :)

matashen 14. Mai 2014 12:41

AW: StringGrid Spalte mit Namen "ansprechen"
 
ich denke so würds auch gehen

Delphi-Quellcode:
StringGrid1.Columns[stringgrid1.rows[0].indexof('LAST_NAME')].Header := 'Nachname'
Du kannst immer mit indexOf die Spalte/Zeile rausfinden. du kannst auch mittels rows und cols die Zeile/Spalte als ganzes lesen und schreiben indem du delimiter setzt und den Text als delimitertext abgreifst, oder eben als text also sowas wie stringgrid1.rows[0].text gibt dir die gesamte erste Zeile zurück
Bei stringgrid1.rows[0].delimitertext inklusive der gesetzten trennzeichen

Gruß Matthias

mkinzler 14. Mai 2014 12:43

AW: StringGrid Spalte mit Namen "ansprechen"
 
Was macht man nicht alles, damit endlich das letzte Stück Performance hin ist ... :stupid:

matashen 14. Mai 2014 12:51

AW: StringGrid Spalte mit Namen "ansprechen"
 
irgendwas braucht man ja damit wieder neue Hardware gekauft werden muss. Für den 0815 Bürokram reicht doch auch die 10 Jahr alte Kiste, aber wenn dann ne solche Resourcen Hammerapplication kommt.....:twisted::twisted:

Nils S. 14. Mai 2014 13:45

AW: StringGrid Spalte mit Namen "ansprechen"
 
So etwas in der Art habe ich auch schon probiert.
Leider gibt es bei mir für das StringGrid weder .Rows, noch ein .IndexOf.
Liegt wahrschienlich an Firemonkey oder hast Du das auch mit Firemonkey getestet/gemacht?

Wobei die Variante mit der separaten Klasse wahrscheinlich eh eleganter ist oder?

himitsu 14. Mai 2014 13:51

AW: StringGrid Spalte mit Namen "ansprechen"
 
In einem StringGrid haben die spalten einen Namen?
Nja, man kann die Namen zumindestens als Hashlist anlegen.
[edit] Achso, in FM ... in der VCL gibt's da jedenfalls Keine.

PS: Ohne Performanceverlust: Konstanten für die Spaltenindize. :zwinker:
(man kann die auch als Record/Class-Const anlegen und hatt dann auch noch einen Namespace davor ... siehe die neuen TColor)

Sir Rufo 14. Mai 2014 14:15

AW: StringGrid Spalte mit Namen "ansprechen"
 
Zitat:

Zitat von himitsu (Beitrag 1258878)
PS: Ohne Performanceverlust: Konstanten für die Spaltenindize. :zwinker:
(man kann die auch als Record/Class-Const anlegen und hatt dann auch noch einen Namespace davor ... siehe die neuen TColor)

Das wird aber nichts bringen, denn wenn die Spalte
Delphi-Quellcode:
Name
von der 3. auf die 1. Position wechselt und
Delphi-Quellcode:
const Name_Col_Idx = 3;
dann sprichst du die falsche Spalte an ;)

himitsu 14. Mai 2014 14:24

AW: StringGrid Spalte mit Namen "ansprechen"
 
Nja, entweder man pflegt das, oder löst es über variablen, welche man befüllen lässt

und in der VCL gibt es eh keinen Namen, wo es dann egal wäre. :stupid:

Sir Rufo 14. Mai 2014 14:34

AW: StringGrid Spalte mit Namen "ansprechen"
 
Zitat:

Zitat von himitsu (Beitrag 1258887)
Nja, entweder man pflegt das, oder löst es über variablen, welche man befüllen lässt

und in der VCL gibt es eh keinen Namen, wo es dann egal wäre. :stupid:

In FMX sind die einzelnen Spalten Komponenten, die an das StringGrid gehängt werden (darum haben die Namen) und da unterscheiden die sich.

Worin sich die VCL/FMX-StringGrids nicht unterscheiden ist, dass das Umsortieren der Spalten eine Benutzereingabe ist, die man natürlich respektieren (merken) sollte und das Programm darauf auch reagieren lassen (wenn man es denn schon zulässt).

Am einfachsten geht das wohl mit einer Delphi-Referenz durchsuchenTCollection. Dort gibt es neben der ID auch einen Index.
Die ID bleibt immer gleich nur der Index verändert sich beim umsortieren.

Wenn man jetzt das Event Delphi-Referenz durchsuchenTStringGrid.OnColumnMoved nimmt und diese Informationen an die Collection weitergibt, dann kann man über die ID auch den aktuellen Index herausfinden und hat die passende Spalte an der Hand.

Dejan Vu 14. Mai 2014 15:10

AW: StringGrid Spalte mit Namen "ansprechen"
 
Zitat:

Zitat von mkinzler (Beitrag 1258862)
Was macht man nicht alles, damit endlich das letzte Stück Performance hin ist ... :stupid:

Man tut eine Dictionary nehmen, in die man vorher alles reinpackt, was man während der Laufzeit so alles wiederfinden will. Dann kann man den Kauf der neuen Hexa-Core-CPU auf Weihnachten verschieben.

Nils S. 14. Mai 2014 15:20

AW: StringGrid Spalte mit Namen "ansprechen"
 
Vielen Dank Volker!
Es funktioniert und ich habe es nach intensiven Überlegungen sogar verstanden. :lol:

Vielleicht noch zur Anmerkung, falls das hier mal jemand liest, der die Gleiche Überlegung hat:
Die Spalten des StringGrids haben erstmal keinen Namen.
Ich habe vermutet, dass sie direkt den Namen bekommen, welcher in der Datenbank angegeben ist.
Aber über

Delphi-Quellcode:
StringGrid1.Columns["Index"].Name := 'Spaltenname'


kann man vorher ja die Namen zuweisen.

Popov 14. Mai 2014 17:03

AW: StringGrid Spalte mit Namen "ansprechen"
 
Kann es sein, dass das alles erst in Delphi > 7 eingebaut wurde? Zumindest kenne ich das nicht.

Auch wenn es bereits eine Lösung gibt und mein Delphi keine Columns bei StringGrid kennt, ListView hat Columns und die haben eine ID. Im Gegensatz zum Index ist die ID eindeutig und wird im Laufe der Sitzung kein weiteres mal vergeben. Wird ein Column gelöscht und eine neue erstellt (so zumindest meine Beobachtung bei einigen Tests vor paar Jahren), bekommt es eine neue ID. Somit kann man immer leicht Listen erstellen die einen Namen mit einer ID verbinden.

Sir Rufo 14. Mai 2014 17:14

AW: StringGrid Spalte mit Namen "ansprechen"
 
@Popov

Ich nehme es stark an, denn AFAIK hat Delphi 7 noch kein Firemonkey ;)

Popov 14. Mai 2014 20:05

AW: StringGrid Spalte mit Namen "ansprechen"
 
Ist schon klar, die Frage steht andererseits auch unter "Programmieren allgemein".

Nils S. 15. Mai 2014 13:21

AW: StringGrid Spalte mit Namen "ansprechen"
 
Eine Frage habe ich dann doch noch.

Am Anfang der Funktion wird Result auf nil gesetzt.
Warum ist das nötig?
Result ist am Anfang einer Funktion, auch wenn sie mehrmals aufgerufen wird, doch immer "nichts" oder?

Und
Zitat:

Zitat von Popov (Beitrag 1258933)
Ist schon klar, die Frage steht andererseits auch unter "Programmieren allgemein".

Gibt es einen anderen Ort, wo solche Fragen lieber gepostet werden sollten?

DeddyH 15. Mai 2014 13:24

AW: StringGrid Spalte mit Namen "ansprechen"
 
GUI-Design mit VCL / FireMonkey / Common Controls böte sich IMO an.

himitsu 15. Mai 2014 14:12

AW: StringGrid Spalte mit Namen "ansprechen"
 
Result ist sowas wie eine lokale Variable und wenn in der For-Schleife nichts gefunden und dem Result zugewiesen wird, auf was würde das Result dann stehen?

Nils S. 15. Mai 2014 14:54

AW: StringGrid Spalte mit Namen "ansprechen"
 
Undefiniert?^^

Nersgatt 15. Mai 2014 15:17

AW: StringGrid Spalte mit Namen "ansprechen"
 
Zitat:

Zitat von Nils S. (Beitrag 1258994)
Undefiniert?^^

Nein. Das wäre ja schön. Was da dann drin steht ist mehr oder weniger Zufall.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 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 by Thomas Breitkreuz