TTIPropertyGrid > inhalt updaten

Rund um die LCL und andere Komponenten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

TTIPropertyGrid > inhalt updaten

Beitrag von pluto »

Hallo,
ich möchte gerne den inhalt einer TTIPropertyGrid updaten habe alle proceduren die ich finden konnte probiert aber leider ohne erfolg!

mein ziel ist es die werte abzudaten.
fvt.TIObject:=selobject;
fvt.PropEditLookupRootChange;
fvt.RefreshPropertyValues;
fvt.Clear;

writeln('test');
fvt.Update;
fvt.Invalidate;
fvt.Refresh;
diese proceduren habe ich getestet !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Hi pluto,

nun mal genauer, das PropertyGrid datet sich selbst up. Willst du das bezogen Objekt updaten und dessen Einstellungen verändern? Soll das zur Laufzeit passieren oder während des Entwurfes?
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

währes des entwurfes !
ich verändere die position eigenschaften im programm und dann möchte ich sie sofort dem OI mitteilen !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Sodele pluto,

dann bau Dir mal ein kleines Programm. Leg auf das Formular ein Panel und setz Align = alLeft, dann zieh das etwas breiter und setz auf das Panel eine TMemo und setz Align = alClient. Dann setzt Du TIPropertyGrid neben das Panel und setzt Align = alClient. Setz das OI auf Panel1 und erzeuge das Event OnModified. Da kopierst Du den Code von dem Beispiel aus :

procedure TForm1.TIPropertyGrid1Modified(Sender: TObject);

einfach komplett rein. Sieh Dir mal an was das macht und bastel einfach weiter dran rum. Das sollte schon etwas helfen.

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  ComCtrls, RTTIGrids, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    TIPropertyGrid1: TTIPropertyGrid;
    procedure TIPropertyGrid1Modified(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
procedure TForm1.TIPropertyGrid1Modified(Sender: TObject);
var
  cname: String;
  i: Integer;
begin
  //
  Memo1.Clear;
  cname:= '------------------------';
  Memo1.Append(cname);
  cname:= 'Objekt-Type: ' + TIPropertyGrid1.TIObject.ClassName;
  Memo1.Append(cname);
  cname:= 'Objekt-Name: ' + TIPropertyGrid1.TIObject.GetNamePath;
  Memo1.Append(cname);
  Memo1.Append('');
  Memo1.Append('geändertes Property');
  Memo1.Append('');
  cname:= TIPropertyGrid1.GetActiveRow.Name;
  cname:= '    ' + cname + ':' + TIPropertyGrid1.CurrentEditValue;
  Memo1.Append(cname);
  cname:= '----------------';
  Memo1.Append(cname);
  cname:= 'Property-Liste';
  Memo1.Append(cname);
  cname:= '----------------';
  Memo1.Append(cname);
  for i:= 0 to TIPropertyGrid1.RowCount - 1 do begin
    cname:= TIPropertyGrid1.Rows[i].Name;
    cname:= cname + ':' + TIPropertyGrid1.Rows[i].LastPaintedValue;
    Memo1.Append(cname);
  end;
end;
 
initialization
  {$I unit1.lrs}
 
end.


cu Hardy

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

der code fügt doch nur einer Memo komponente daten hinzu wenn ich es richtig deute !

ich habe folgendes problem:
ich verschiebe rechte ecke auf eine paintbox diese rechtecke sind objekte mit eigenschaften. Nun möchte ich das sich sobalt ich das objekte verschiebe oder sich die größe verändert die daten entsprechend updaten im OI beim onMouseMove und genau das liegt mein problem ich hoffe diese beschreibung hilft euch weiter !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Also sowas, jetzt verhundst er mir auch noch das Beispiel.

Der zeigt Dir die Propertys von dem verbundenen Objekt an und gibt Im Kopf das geänderte Property mit neuem Wert aus.

So, und wenn Du nun das Objekt anklickst, dann machst ein OnKeydown und trägst dann das Objekt im PropertyGrid als das verbundene Obhekt an. Ab dem Augenblich zeigt er dir die Propertys von dem Teil, wenn das verschiebts ändern sich auch die Daten. Da mußt du garnix groß machen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

naja bei mir ändern sich die werte im OI erst wenn ich erneut drauf klicke aus das entsprechne objekt !

ich habe ein neues problem beim OI:
ich wollte ein BitMap einbinden das sieht so aus:
unit uextras;

{$mode objfpc}{$H+}

interface

uses
LCLIntf, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,StdCtrls,upaint2ObjBase,uPaint2Object;

type

{ tImageListB }

tImageListB = class(TPaint2Object)
public
fImage:TBitmap;
constructor Create;
private
function getImage: TBitmap;
procedure setImage(const AValue: TBitmap);

published
property Image:TBitmap read getImage write setImage;
end;

implementation

constructor tImagelistB.Create;
begin
Name:='ImagelistB';
fimage:=TBitmap.Create;


inherited Create;
end;

function tImageListB.getImage: TBitmap;
begin
result:=fImage
end;

procedure tImageListB.setImage(const AValue: TBitmap);
begin
fimage:=aValue;
end;


end.



sobalt ich das programm starte und auf den image klicke im OI dann öffnet sich das dialog wie erwartet nur wenn ich dann auf load oder save gehe kommt eine AV(zugriefs verletztung).... kann mir jemmand sagen was ich falsch mache ?
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Hmmm, ich hab mir abgewöhnt im Konstruktor Create etwas vor dem inherited zu initialisieren. Bei Delphi hat der die Dinger oft wieder zurückgesetzt und hat dabei mich auf den Topf gesetzt.

Ich vermute mal streng, dein fimage ist nil, deswegen die Zugriffsverletzung.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

fimage wird doch installisiert im Create ?
probieren kann ich es, aber ich meine das der oi die komponente garnich im oi angezeigt hätte, wenn sie nil währe !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Setz das inherited mal nach oben gleich unter das begin, das ist eigentlich der übliche Weg.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

die idee hatte ich auch gerade, aber leider keine änderung, sobalt ich auf load klicke kommt die AV! ich bin sicher ich muss irgenwas installisieren, aber was ?
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Und dann willst Du das im OI anzeigen oder wie?

Ich glaub das geht garnicht, weil das keine sichtbare Komponente ist. Da kann er dann auch nicht auf die Propertys zugreifen, die sind dann nicht published.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

das muss doch gehen... oder muss ich mir mein eigens dialog erstellen wo das dann geht ?
dann hätte ich das problem wie binde ich dies dialog an den OI den ich zurlaufzeit nute !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Man kann sowas machen, dazu mußt Du dir von dem TBitmap ne neue Klasse ableiten:

TMyBitmap = class(TBitmap)

end;

und mußt dann die Propertys die du anzeigen willst einfach im published wiederholen. Das muß aber dann ohne Typangabe passieren, also einfach nur:

property PropName;
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

und dann hätte ich einen eigenen eigenschafst editor ?
problem ist nur welche properts sind das ?
MFG
Michael Springwald

Antworten