AGB  ·  Datenschutz  ·  Impressum  







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

Befüllen eines Stringgrids

Ein Thema von magstripe · begonnen am 9. Sep 2020 · letzter Beitrag vom 10. Sep 2020
Antwort Antwort
magstripe

Registriert seit: 8. Sep 2020
14 Beiträge
 
#1

Befüllen eines Stringgrids

  Alt 9. Sep 2020, 10:38
Hallo,

ich bin relativ neu, was Delphi angeht. Habe aber schon einige Jahre Erfahrung mit Microcontrollern. Zu Delphi gekommen, bin ich wie die Jungfrau zum Kind. Sprich... Neuer Job, neues (Altes) Projekt.
Wir verwenden hier Delphi 10.4.

Nun zu meiner Frage:
Ich habe ein (FMX) Stringgrid mit mehreren Spalten.
Die einzelnen Zelle befülle ich mit

Delphi-Quellcode:
  Usergrid.Cells[0,Usergrid.RowCount-1]:='XYZ';
  Usergrid.Cells[1,Usergrid.RowCount-1]:='ABC';
  Usergrid.Cells[2,Usergrid.RowCount-1]:='123';
Funktioniert soweit ohne Probleme. Wenn nun aber der Nutzer mit der Maus die Spalten neu anordnet, also z.b. Spalte 2 zu Spalte eins wird und das Grid neu befüllt wird, stimmen die Spaltenüberschriften logischweise nicht mehr überein.

Gibt es eine Möglichkeit die Spalten zu befüllen, ohne von der tatsächlichen Position abhängig zu sein?

Über einen Hinweis oder einen Link würde ich mich freuen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

AW: Befüllen eines Stringgrids

  Alt 9. Sep 2020, 10:47
Am Einfachsten wird es mit einer datensensitieven Verbindung sein,
also Memory-DataSet oder TList<TYourDataObject> via LiveBinding ans Grind anbinden
und dann über die Liste die Daten verwalten. Die Zuordnung zu den richtigen Cells/Rows/Colums wird dann automatisch vorgenommen.
(im VCL war es z.B. TClientDataSet+TDataSource ans TDBGrid)


Ich weiß nicht wie es beim Delphi-Grid aussieht,
aber entweder du mußt über den Spalten-Namen auf die Columns zugreifen, anstatt über einen veränderlichen Index.
Falls sich im FMX-Grod die Objekte der Spalten nicht ändern (neu erstellt werden), wenn man sie verschiebt, dann kann man sich auch zu Beginn die Zeiger Objektreferenzen merken. (im VCL-Grid gind sowas nicht, wenn ich mich richtig erinnere)

Oder, viele Grid-Komponenten (ordentlicher Hersteller) haben die sichtbaren Rows und Coumns
und inten zusätlich noch interne DataRows und Columns Fields,
bzw die sichrbaren Rows/Columns haben zwei Indize, einmal für die Anzeige und so wie sie erstellt wurden (ursprünglich waren).
Du brauchst den "unveränderlichen" "Erstellungs"-Index, wenn du auf die sichtbaren Columns zugreifen willst.
[EDIT] Schau mal was OriginalIndex oder ComponentIndex statt Index in den TStringColumn ausgeben. Aber über den Namen wird es bestimmt besser, vor allem der Code auch lesbarer.


PS: Filtern und Sortieren gibt es bei dir auch? (irgendwann mal)
Wenn ja, dann nicht vergessen, dass auch der richtige Row-Index wichtig ist.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Sep 2020 um 10:58 Uhr)
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
890 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Befüllen eines Stringgrids

  Alt 9. Sep 2020, 11:20
Ich arbeite leider auch nur mit den TTMSFMXGrid von TMS-Software, welches deutlich komfortabler in sehr vielen Belangen ist. Dort gibt es die Methoden:
Delphi-Quellcode:
  displRow:=grid.realToDisplRow(realRow);
  displCol:=grid.RealToDisplColumn(realCol);
  realRow:=grid.DisplToRealRow(displRow);
  realCol:=grid.DisplToRealColumn();
Ich glaube aber, dass TTMSFMXGrid keine Erweiterung von TStringGrid ist, sondern eine Neuimplementierung. Daher kann man sich daran wahrscheinlich nicht orientieren.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

AW: Befüllen eines Stringgrids

  Alt 9. Sep 2020, 13:42
Bei TStringGrid könnte man mit Class Helper arbeiten:
Delphi-Quellcode:
  TGridRow = record
    constructor Create(AGrid: TStringGrid; ARowNum: Integer);
  private
    FGrid: TStringGrid;
    FRowNum: Integer;
    function GetColumn(const AName: string): string;
    procedure SetColumn(const AName, AValue: string);
  public
    property Column[const AName: string]: string read GetColumn write SetColumn; default;
  end;

  TColumnHelper = class helper for TStringGrid
  private
    procedure CheckRowNum(const ARowNum: Integer);
    function GetGridRow(const ARowNum: Integer): TGridRow;
  protected
    function GetColumnIndex(const AName: string): Integer;
  public
    property GridRow[const ARowNum: Integer]: TGridRow read GetGridRow;
  end;

implementation

{ TColumnHelper }

procedure TColumnHelper.CheckRowNum(const ARowNum: Integer);
begin
  if ARowNum < 1 then
    raise Exception.CreateFmt('TColumnHelper RowNum(%d) invalid < 1', [ARowNum]);

  if ARowNum >= RowCount then
    raise Exception.CreateFmt('TColumnHelper RowNum(%d) invalid >= RowCount(%d)', [ARowNum, RowCount]);
end;

function TColumnHelper.GetColumnIndex(const AName: string): Integer;
var
  i: Integer;
begin
  for i := 0 to ColCount - 1 do
  begin
    if SameText(AName, Cells[i, 0]) then
      Exit(i);
  end;
  raise Exception.CreateFmt('TColumnHelper Column[''%s''] invalid', [AName]);
end;

function TColumnHelper.GetGridRow(const ARowNum: Integer): TGridRow;
begin
  CheckRowNum(ARowNum);

  Result := TGridRow.Create(Self, ARowNum);
end;

{ TGridRow }

constructor TGridRow.Create(AGrid: TStringGrid; ARowNum: Integer);
begin
  FGrid := AGrid;
  FRowNum := ARowNum;
end;

function TGridRow.GetColumn(const AName: string): string;
begin
  Result := FGrid.Cells[FGrid.GetColumnIndex(AName), FRowNum];
end;

procedure TGridRow.SetColumn(const AName, AValue: string);
begin
  FGrid.Cells[FGrid.GetColumnIndex(AName), FRowNum] := AValue;
end;
Delphi-Quellcode:
var
  lRow: TGridRow;
begin
  StringGrid1.Cells[0,0] := 'Zeile';
  StringGrid1.Cells[1,0] := 'Name';
  StringGrid1.Cells[2,0] := 'Ort';
  StringGrid1.Cells[3,0] := 'Tel.';

  StringGrid1.GridRow[1]['Zeile'] := '1';
  StringGrid1.GridRow[1]['Name'] := 'Hans';
  StringGrid1.GridRow[1]['Ort'] := 'Ort1';
  StringGrid1.GridRow[1]['Tel.'] := '000/00001';

  lRow := StringGrid1.GridRow[2];
  lRow['Zeile'] := '2';
  lRow['Name'] := 'Otto';
  lRow['Ort'] := 'Ort2';
  lRow['Tel.'] := '000/00002';
end;
  Mit Zitat antworten Zitat
magstripe

Registriert seit: 8. Sep 2020
14 Beiträge
 
#5

AW: Befüllen eines Stringgrids

  Alt 10. Sep 2020, 11:17
Vielen Dank an alle. Ich habe es jetzt hinbekommen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:02 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