Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi XE7: Mobile App und TStringGrid (https://www.delphipraxis.net/182343-xe7-mobile-app-und-tstringgrid.html)

Kralle 17. Okt 2014 20:31

XE7: Mobile App und TStringGrid
 
Moin,

ich bin anscheinend zu blöd, aber ich möchte einfach nur in einer Mobilen Anwendung ein StringGrid nutzen, aber weder über den Objektinspektor noch via Code kann ich die Anzahl
der Spalten festlegen.
Gibt es keine Spalten im Grid mehr???

Gruß HEiko

mkinzler 17. Okt 2014 21:03

AW: XE7: Mobile App und TStringGrid
 
Doch, diese sind aber untergeordnete Objekte. Du kannst weitere Spalten im Kontextmenü erzeugen oder Eine Instanz von TStringColumn im Code erzeugen und vom Grid adoptieren lassen.

Kralle 17. Okt 2014 21:10

AW: XE7: Mobile App und TStringGrid
 
Hallo,

Zitat:

Zitat von mkinzler (Beitrag 1276472)
Doch, diese sind aber untergeordnete Objekte.

Aha ...

Zitat:

Zitat von mkinzler (Beitrag 1276472)
Du kannst weitere Spalten im Kontextmenü erzeugen

Okay, das habe ich gefunden.

Zitat:

Zitat von mkinzler (Beitrag 1276472)
oder Eine Instanz von TStringColumn im Code erzeugen und vom Grid adoptieren lassen.

:?::?::?:
Sorry, das ist mir zu hoch.
Kannst Du mir das erklären?

Gruß HEiko

mkinzler 17. Okt 2014 21:13

AW: XE7: Mobile App und TStringGrid
 
Das Grid als Parnt setzen
Delphi-Quellcode:
var
  col: TStringColumn;
..
  col := TStringColumn.Create( StringGrid);
  col.Parent := StringGrid;
  col. ...

Kralle 17. Okt 2014 21:27

AW: XE7: Mobile App und TStringGrid
 
Hallo,

Zitat:

Zitat von mkinzler (Beitrag 1276474)
var
col: TStringColumn;
..
col := TStringColumn.Create( StringGrid);
col.Parent := StringGrid;
col. ...[/DELPHI]

Das muß ich dann aber für jede Spalte machen - also col1 ; col2; col3 ...
Richtig?
Da "col" aber laut Objektinspektor keine Rows kennt, wie spreche ich Spalte 2 Zeile 3 an?

Gruß Heiko

himitsu 17. Okt 2014 21:35

AW: XE7: Mobile App und TStringGrid
 
Im Allgemeinen geht man erst auf die Zeile (Datensatz) und da dann auf die Spalten/Werte
und in Col sind meistens nur die Definitionen der Spalten drin.

Also ich würde da mal weiter suchen.



PS: Wie wäre es, wenn du eine Datenquelle an dein Grid hängst/bindest und die Spalten-/Zeilenerstellung dem Grid überlässt?
(DataSet, Liste oder Dergleichen)


[edit]
Oder es gibt Zelle, so wie beim VCL-Grid.
Und ich dachte das FMX macht alles absichtlich anders. :stupid:

mkinzler 17. Okt 2014 21:44

AW: XE7: Mobile App und TStringGrid
 
Zitat:

Da "col" aber laut Objektinspektor keine Rows kennt, wie spreche ich Spalte 2 Zeile 3 an?
Delphi-Quellcode:
StringGrid.Cells[1,2]

Kralle 17. Okt 2014 22:25

[Gelöst] XE7: Mobile App und TStringGrid
 
Hallo,

erstmal Danke für Deine Gedult.

Zitat:

Zitat von mkinzler (Beitrag 1276477)
Delphi-Quellcode:
StringGrid.Cells[1,2]

Ein
Delphi-Quellcode:
 StringGrid1.Cells[2,2]:=Edit2.Text;
bleibt ohne Folgen. Das Grid bleibt leer.:cry:
Warum:?:

Lösung: Die Text wird in die Zelle geschrieben, aber wird erst sichtbar nach einem
Delphi-Quellcode:
StringGrid1.Repaint;
Gruß Heiko

himitsu 17. Okt 2014 22:35

AW: XE7: Mobile App und TStringGrid
 
Hast du auch genügend Zeilen erstellt?

[edit]
hmmmm.

Kralle 17. Okt 2014 22:38

AW: XE7: Mobile App und TStringGrid
 
Hallo,

Zitat:

Zitat von himitsu (Beitrag 1276480)
Hast du auch genügend Zeilen erstellt?

Ja. Lösung siehe oben.

Gruß Heiko

Sir Rufo 17. Okt 2014 22:40

AW: XE7: Mobile App und TStringGrid
 
Zitat:

Zitat von Kralle (Beitrag 1276481)
Hallo,

Zitat:

Zitat von himitsu (Beitrag 1276480)
Hast du auch genügend Zeilen erstellt?

Ja. Lösung siehe oben.

Gruß Heiko

Also bei mir funktioniert
Delphi-Quellcode:
StringGrid1.RowCount := 20;
StringGrid1.Cells[2,2] := 'Test';
ganz hervorragend ... so wie erwartet.

Kralle 17. Okt 2014 22:44

AW: XE7: Mobile App und TStringGrid
 
Guten Abend Sir Rufo;

Zitat:

Zitat von Sir Rufo (Beitrag 1276483)
Also bei mir funktioniert
Delphi-Quellcode:
StringGrid1.RowCount := 20;
StringGrid1.Cells[2,2] := 'Test';
ganz hervorragend ... so wie erwartet.

Und bei mir wie erwartet nicht auf Anhieb und nur mit einem Refresh.
Aber, langsam gewöhne ich mich daran das bei mir egal in welcher Version auf welchem OS nichts so funktioniert wie es bei allen anderen funktioniert :cry:

Gruß HEiko

himitsu 17. Okt 2014 22:48

AW: XE7: Mobile App und TStringGrid
 
Hatte ich dann auch schon gesehn :mrgreen:

Ich will ja nicht sagen diese Komponente ist Schrott, aber
http://www.delphipraxis.net/181829-l...bjectlist.html :roll:


Hab mal nachgesehn:
* Im Gegensatz zum VCL-StringGrid erweitert das FMX-StringGrid die Zeilen von selber, wenn man auf Nichtexistierende zugreift.
* Es wird nur der Text in
Delphi-Quellcode:
FCells: array of string;
(TStringColumn) eingetragen, und kein Refresh ausgelöst ... das mußt du halt selber machen. (oder warten, bis das irgendwann von "alleine" passiert)

Sir Rufo 17. Okt 2014 22:48

AW: XE7: Mobile App und TStringGrid
 
Wenn ich den
Delphi-Quellcode:
RowCount
nicht setze, dann habe ich das gleiche Verhalten, wie du es hier beschreibst.

Ach ja, völlig korrekt (so wie man es machen sollte) ist das hier
Delphi-Quellcode:
  StringGrid1.BeginUpdate;
  try
    StringGrid1.RowCount := 20;
    StringGrid1.Cells[2, 2] := 'Test';
  finally
    StringGrid1.EndUpdate;
  end;
Ok, klappt auch nur beim ersten Mal, weil sich der RowCount von 100 auf 20 ändert. Ein Eintragen von Werten löst einfach nicht den benötigten Refresh aus :)

Sir Rufo 17. Okt 2014 23:16

AW: XE7: Mobile App und TStringGrid
 
Ok, zur generellen Abhilfe hier ein netter Helper
Delphi-Quellcode:
unit FMX.Helper.Controls;

interface

uses
  FMX.Controls;

type
  IControlUpdater = interface
    ['{D90FA99C-F9EC-4A55-9E99-95A54D1E30F8}']
  end;

  TControlUpdater = class( TInterfacedObject, IControlUpdater )
  private
    FControl: TControl;
    constructor Create( AControl: TControl );
  public
    destructor Destroy; override;
  end;

  TControlHelper = class helper for TControl
    function BeginAutoUpdate: IControlUpdater;
  end;

implementation

uses
  System.SysUtils;

{ TControlUpdater }

constructor TControlUpdater.Create( AControl: TControl );
begin
  inherited Create;
  FControl := AControl;
  // BeginUpdate
  FControl.BeginUpdate;
end;

destructor TControlUpdater.Destroy;
begin
  // EndUpdate
  FControl.EndUpdate;
  // Refresh auf dem sichtbaren Bereich anmelden
  // das ist schonender als ein hartes Repaint
  FControl.InvalidateRect( FControl.ClipRect );
  inherited;
end;

{ TControlHelper }

function TControlHelper.BeginAutoUpdate: IControlUpdater;
begin
  Result := TControlUpdater.Create( Self );
end;

end.
Und so verwenden (geht jetzt bei jedem Control)
Delphi-Quellcode:
uses
  FMX.Helpers.Controls;

procedure TSomeForm.SomeMethod;
begin
  StringGrid1.BeginAutoUpdate;

  StringGrid1.Cells[2,2] := 'Test';
end;
Sobald die Methode verlassen wird, wird auch das erzeugte Interface
Delphi-Quellcode:
IControlUpdater
wieder freigegeben (RefCount geht auf 0)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:45 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