Autor Téma: Použití StringGrid ve Firemonkey  (Přečteno 758 krát)

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 108
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Použití StringGrid ve Firemonkey
« kdy: 26-02-2021, 17:07:34 »
Ahoj,
snažím se vytvořit svou první "multiplatform" aplikaci přes FireMonkey. Když jsem měl jedno okno s tlačítky, tak mi to fungovalo. Teď chci přidat form s TStringGridem a neumím ho nijak naplnit. Vždy mi to na EndUpdate hází naprosto nesmyslná exceptions. (c00000005 ACCESS_VIOLATION) Dochází k tomu v TControl.SetHitTest u vyvolání HitTestChanged (unit FMX.Controls)
mám tento kód, který by mi měl vytvořit jednoduchou tabulku z řetězce hexa kódů. V podstatě prohlížeč, vlevo 16 hexa čísel, vpravo jejich ASCII podoba.

Kód: Delphi [Vybrat]
  1. unit UHexView;
  2.  
  3. interface
  4.  
  5. uses
  6.   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  7.   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox;
  8.  
  9. type
  10.   THexView = class(TForm)
  11.     gridHex: TStringGrid;
  12.     Panel1: TPanel;
  13.     Panel2: TPanel;
  14.     StringColumn1: TStringColumn;
  15.     StringColumn2: TStringColumn;
  16.     StringColumn3: TStringColumn;
  17.     StringColumn4: TStringColumn;
  18.     StringColumn5: TStringColumn;
  19.     StringColumn6: TStringColumn;
  20.     StringColumn7: TStringColumn;
  21.     StringColumn8: TStringColumn;
  22.     StringColumn9: TStringColumn;
  23.     StringColumn10: TStringColumn;
  24.     StringColumn11: TStringColumn;
  25.     StringColumn12: TStringColumn;
  26.     StringColumn13: TStringColumn;
  27.     StringColumn14: TStringColumn;
  28.     StringColumn15: TStringColumn;
  29.     StringColumn16: TStringColumn;
  30.     StringColumn17: TStringColumn;
  31.     StringColumn18: TStringColumn;
  32.     StringColumn19: TStringColumn;
  33.     StringColumn20: TStringColumn;
  34.     StringColumn21: TStringColumn;
  35.     StringColumn22: TStringColumn;
  36.     StringColumn23: TStringColumn;
  37.     StringColumn24: TStringColumn;
  38.     StringColumn25: TStringColumn;
  39.     StringColumn26: TStringColumn;
  40.     StringColumn27: TStringColumn;
  41.     StringColumn28: TStringColumn;
  42.     StringColumn29: TStringColumn;
  43.     StringColumn30: TStringColumn;
  44.     StringColumn31: TStringColumn;
  45.     StringColumn32: TStringColumn;
  46.     StringColumn33: TStringColumn;
  47.     StringColumn34: TStringColumn;
  48.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  49.   private
  50.     { Private declarations }
  51.     pObsah : String;
  52.  
  53.     Procedure PisObsah(Const Vst : String);
  54.   public
  55.     { Public declarations }
  56.     property Obsah : String Read  pObsah
  57.                             Write PisObsah;
  58.   end;
  59.  
  60. var
  61.   HexView: THexView;
  62.  
  63. implementation
  64. {$R *.fmx}
  65.  
  66. procedure THexView.FormClose(Sender: TObject; var Action: TCloseAction);
  67. begin
  68. // Action:=caFree;
  69. end;
  70.  
  71. procedure THexView.PisObsah(const Vst: String);
  72. Var
  73.    __Sl      : TStringList;
  74.    __I       : Integer;
  75.    __Radek   : Integer;
  76.    __Sloupec : Integer;
  77. begin
  78.  pObsah:=Vst;
  79.  __Sl:=TStringList.Create;
  80.  gridHex.BeginUpdate;
  81.  try
  82.   __Sl.StrictDelimiter:=True;
  83.   __Sl.Delimiter:=' ';
  84.   __Sl.DelimitedText:=Vst;
  85.   gridHex.ClearContent;
  86.   __I:=(__Sl.Count div 8);
  87.   if (__Sl.Count mod 8)<>0 then
  88.    Inc(__I);
  89.   gridHex.RowCount:=1+__I;
  90.  
  91.   for __I := 0 to gridHex.ColumnCount-1 do
  92.    case __I of
  93.      0     : gridHex.Columns[__I].Header:='';
  94.      1..10 : gridHex.Columns[__I].Header:=IntToStr(__I-1);
  95.     11..16 : gridHex.Columns[__I].Header:=Chr(__I-11+65);
  96.         17 : gridHex.Columns[__I].Header:='';
  97.     18..27 : gridHex.Columns[__I].Header:=IntToStr(__I-18);
  98.     28..33 : gridHex.Columns[__I].Header:=Chr(__I-28+65);
  99.    end;
  100.  
  101.   for __I := 1 to gridHex.RowCount-1 do
  102.    gridHex.Cells[0,__I]:=Format('%x',[__I*16]);
  103.  
  104.    __Radek:=1;
  105.    __Sloupec:=1;
  106.   for __I := 0 to __Sl.Count-1 do
  107.    begin
  108.     gridHex.Cells[__Sloupec,__Radek]:=__Sl[__I];
  109.     gridHex.Cells[__Sloupec+17,__Radek]:=__Sl[__I]; //Zatim
  110.     if __Sloupec=16 then
  111.      begin
  112.       __Sloupec:=1;
  113.       Inc(__Radek);
  114.      end
  115.                     Else
  116.      Inc(__Sloupec);
  117.    end;
  118.  finally
  119.   gridHex.EndUpdate;
  120.   __Sl.Free;
  121.  end;
  122. end;
  123.  
  124. end.
  125.  
  126.  

vyvolávám to takto:
Kód: Delphi [Vybrat]
  1. Var
  2.    __HW : THexView;
  3. begin
  4.  __HW:=THexView.Create(Self);
  5.  try
  6.  
  7.   __HW.Obsah:='FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF';
  8.  
  9.   __HW.Show;
  10.  finally
  11. //  __HW.Release;
  12.  end;
  13. end;
  14.  
  15.  

Když jsem tam ještě neměl begin a end update, tak mi to padalo už na nastavování počtu řádků nebo hlavičce druhého sloupce.
Můžete mi poradit, co mám špatně?

Díky

Pb

edit: používám Embarcadero® RAD Studio 10.4 Version 27.0.38860.1461 , update na 10.41
« Poslední změna: 26-02-2021, 17:25:55 od PetrB0 »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2984
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Použití StringGrid ve Firemonkey
« Odpověď #1 kdy: 26-02-2021, 18:41:51 »
Hod sem cely program vcetne fmx
Embarcadero MVP - Czech republic

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 108
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Použití StringGrid ve Firemonkey
« Odpověď #2 kdy: 26-02-2021, 18:56:35 »
Tady to je.

Díky

Pb

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2984
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Použití StringGrid ve Firemonkey
« Odpověď #3 kdy: 26-02-2021, 19:11:05 »
gridHex.ckClearContent ti vymaze sloupce.
Embarcadero MVP - Czech republic

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 108
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Použití StringGrid ve Firemonkey
« Odpověď #4 kdy: 26-02-2021, 22:16:28 »
Díky, taková blbost. Zjevně ztraceno v překladu ;-)

Pb

P.S. ale zvláštní bylo, že při krokování mi to dávalo správný počet sloupců...