Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 12:24 Der er 38 kommentarer og
3 løsninger

TStrings i komponent

Hej...

jeg vil gerne have en property i mit komponent, som er TStrings... ex Tmemo har også tstrings...

min kode er denne:
unit RealismParser;

interface

uses
  SysUtils, Classes, Controls, GR32_Image, GR32;

type
  TRealismParser = class(TImgView32)
  private
    { Private declarations }
    FCode: TStrings;
    Procedure SetCode(Value: TStrings);
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property Code: TStrings
    read FCode
    write SetCode;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Realism', [TRealismParser]);
end;

procedure TRealismParser.SetCode(Value: TStrings);
begin

  if FCode <> Value then
  begin

    FCode := Value;

  end;

end;

end.


Men når jeg så vil sætte noget ind i delphi7, så siger den den ikke kan sætte ind i nil eller sådan noget :/
Avatar billede hmann Nybegynder
09. februar 2005 - 12:37 #1
Jeg kan fint få dit eksempel til at virke (har dog pillet GR32-halløjet ud, da jeg ikke lige ved hvad er). Men jeg har brugt præcis samme kode til at lave en property på en komponent og selvom metoden virker fint her!
Avatar billede martinlind Nybegynder
09. februar 2005 - 12:38 #2
punkt 1 du skal create et object før du kan bruge, din FCode er ikke created, og så er der også noget med at du skal lave en FCode.Assign(Value) i din Set procedure, men det kan du se i hjælpen eller på TMemo.lines
Avatar billede hmann Nybegynder
09. februar 2005 - 12:38 #3
hvad og hvordan forsøger du at sætte noget ind?
Avatar billede hmann Nybegynder
09. februar 2005 - 12:39 #4
nå ja - du har selvfølgelig lavet en variabel (fx RP) og gjort følgende først:

RP := TRealismParser.Create

og så derefter:

RP.Code := blablabla
Avatar billede martinlind Nybegynder
09. februar 2005 - 12:43 #5
og FCode: TStrings; skal stadig create's
FCode := TStringList.Create;
Avatar billede hmann Nybegynder
09. februar 2005 - 12:47 #6
martinlind> FCode behøver ikke at blive created..

jeg har i hvert fald lige lavet et test hvor jeg smider indholder fra en memo ind i RP.Code og derefter løber RP.Code igennem linie for linie og viser indholdet - det virker fint og har på intet tidspunkt created FCode... har bare created TRealismParser og det er det..
Avatar billede martinlind Nybegynder
09. februar 2005 - 12:58 #7
muligt, men man skal altså create sine klasse instanser ( var's ) i delphi, det er det vist ikke så meget tvivl om, jeg tror det står på side 2 i Object Pascal ref'en
Avatar billede hmann Nybegynder
09. februar 2005 - 12:59 #8
ja sine klasse instanser! det er jo også det man gør når man creater RP.
RP er en instans er klassen TRealismParser
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 13:10 #9
okay... en der kan lave samme kode, bare hvor fcode bliver created?
Avatar billede hmann Nybegynder
09. februar 2005 - 13:12 #10
du behøver ikke create FCode!

hvis du havde fx en property Liste: TList i din komponent, så skulle Liste creates i din komponents create, men FCode behøver du ikke create!
Avatar billede hmann Nybegynder
09. februar 2005 - 13:13 #11
men du skal selvfølgelig stadig create selve instansen af TRealismParser.
se mit indlæg kl 12:39:52
Avatar billede hmann Nybegynder
09. februar 2005 - 13:17 #12
hmmm nu så jeg lige efter i et af mine egne projekter - der må jeg indrømme at jeg creater de properties som er TStringList. Ved ikke lige hvorfor det virker uden i espeholt_jr's projekt...
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 13:20 #13
gør det jo eller ikke...

hvordan gør du så det...

ved godt tstrings skjal creates... ved ikke hvordan
Avatar billede martinlind Nybegynder
09. februar 2005 - 13:20 #14
hvis din comp. skal virke rigtig skal du create den og ikke bare køre din externe instans ind i din FCode, f.eks. hvis du free'er den instans du har kørt ind i FCode, så fejler din FCode, kig i hjælpen på hvordan du laver en TStrings prop. !!
Avatar billede hmann Nybegynder
09. februar 2005 - 13:27 #15
plejer at lave en constructor - i den kan du create din Code..

f.eks:

type
  TRealismParser = class(TImgView32)
  private
    { Private declarations }
    FCode: TStrings;
    Procedure SetCode(Value: TStrings);
  protected
    { Protected declarations }
  public
    { Public declarations }

    Constructor Create;  //din constructor

  published
    { Published declarations }
    property Code: TStrings
    read FCode
    write SetCode;
  end;

.. og nede i implementation:

constructor TRealismParser.Create;
begin
  inherited create;
  FCode := FCode.Create;
end;


.. eller noget i den stil :-)
Avatar billede martinlind Nybegynder
09. februar 2005 - 13:31 #16
og din

procedure TRealismParser.SetCode(Value: TStrings);
begin
  FCode.Assign(Value);
end;

Sådan kan du se det er lavet hvis du kigger i source til TMemo f.eks
Avatar billede martinlind Nybegynder
09. februar 2005 - 13:32 #17
og så lige den her rigtigt :

constructor TRealismParser.Create;
begin
  inherited create;
  FCode := TStringList.Create;
end;

hmann >> det kan også gå lige hurtigt nok :)
Avatar billede kammeyer Nybegynder
09. februar 2005 - 13:33 #18
Den er created i din TMemo - og du benytter den bare i ovenstående kode - den ER created - hvis du ikke har TMemo created, men skal benytte en anden TStrings, så skal du selv sørge for at den anden TStrings ER created før du benytter den i ovenstående kode.

Evt. lav et check for om FCode er created. Og ydermere udvide den med en variabel der afgør om du selv skal oprette + nedlægge FCode eller om du får en ude fra du skal bruge.
Avatar billede hmann Nybegynder
09. februar 2005 - 13:34 #19
martinlind> nå ja... sidder med tusind ting på samme tid, så skidtet kan smutte ;-)
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 13:48 #20
altså...

jeg kan enten lave constructor eller assign tingen?

eller skal begge laves?
Avatar billede hmann Nybegynder
09. februar 2005 - 13:50 #21
begge.. assign er i din SetCode procedure..
constructoren er din create
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 13:52 #22
så må jeg vel spiltte pointsne op... martinlund.. opret svar også
Avatar billede hmann Nybegynder
09. februar 2005 - 13:53 #23
vent med at give point til det virker...
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 13:57 #24
unit RealismParser;

interface

uses
  SysUtils, Classes, Controls, GR32_Image, GR32;

type
  TRealismParser = class(TImgView32)
  private
    { Private declarations }
    FCode: TStrings;
    Procedure SetCode(Value: TStrings);
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create;

  published
    { Published declarations }
    property Code: TStrings
    read FCode
    write SetCode;
  end;

procedure Register;

implementation

constructor TRealismParser.Create;
begin
  inherited create;
  FCode := TStrings.Create;
end;

procedure Register;
begin
  RegisterComponents('Realism', [TRealismParser]);
end;

procedure TRealismParser.SetCode(Value: TStrings);
begin

  FCode.Assign(Value);

end;

end.

[Warning] RealismParser.pas(18): Method 'Create' hides virtual method of base type 'TCustomImgView32'
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 13:59 #25
[Error] RealismParser.pas(33): Not enough actual parameters
[Warning] RealismParser.pas(34): Constructing instance of 'TStrings' containing abstract method 'TStrings.Clear'
[Fatal Error] dclusr.dpk(38): Could not compile used unit 'RealismParser.pas'
Avatar billede hmann Nybegynder
09. februar 2005 - 14:02 #26
den ene er fordi du mangler en parameter til FCode Create'en
mener den skal have en owner med ind som parameter...

prøv lige at ændre FCode := TStrings.Create til:
FCode := TStrings.Create(Self);
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 14:08 #27
inherited create(Self);
  FCode := TStrings.Create();

;)

så kan den compile... men den siger når man i design time skal ændre FCode.. "cannot assign a nil to a TRichTextStrings"
Avatar billede martinlind Nybegynder
09. februar 2005 - 14:10 #28
Du arver fra en comp. så din constructor skal være "rigtig" og du skal huske ovverride i din klasse def.






constructor TRealismParser.Create( aOwner : TComponent );
begin
  inherited create;
  FCode := TStrings.Create;
end;
Avatar billede martinlind Nybegynder
09. februar 2005 - 14:11 #29
unit RealismParser;

interface

uses
  SysUtils, Classes, Controls, GR32_Image, GR32;

type
  TRealismParser = class(TImgView32)
  private
    { Private declarations }
    FCode: TStrings;
    Procedure SetCode(Value: TStrings);
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create( aOwner : TComponent ); override;

  published
    { Published declarations }
    property Code: TStrings
    read FCode
    write SetCode;
  end;

procedure Register;

implementation

constructor TRealismParser.Create( aOwner : TComponent );
begin
  inherited create;
  FCode := TStrings.Create;
end;

procedure Register;
begin
  RegisterComponents('Realism', [TRealismParser]);
end;

procedure TRealismParser.SetCode(Value: TStrings);
begin

  FCode.Assign(Value);

end;

end.

Så er den vist ved at være der :)
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 14:13 #30
hvad med override?

hvis jeg addede aOwner, så kommer den stadig med fejlen...
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 14:15 #31
unit RealismParser;

interface

uses
  SysUtils, Classes, Controls, GR32_Image, GR32;

type
  TRealismParser = class(TImgView32)
  private
    { Private declarations }
    FCode: TStrings;
    Procedure SetCode(Value: TStrings);
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create(aOwner:TComponent); override;

  published
    { Published declarations }
    property Code: TStrings
    read FCode
    write SetCode;
  end;

procedure Register;

implementation

constructor TRealismParser.Create(aOwner:TComponent);
begin
  inherited Create(self);
  FCode := TStrings.Create;
end;

procedure Register;
begin
  RegisterComponents('Realism', [TRealismParser]);
end;

procedure TRealismParser.SetCode(Value: TStrings);
begin

  FCode.Assign(Value);

end;

end.


<- laver stadig fejlen
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 14:16 #32
ps har afsat 100 points istedet for 60, er vist svært :/
Avatar billede martinlind Nybegynder
09. februar 2005 - 14:19 #33
nogle har lige ændret det jeg skrev tidligere

constructor TRealismParser.Create(aOwner:TComponent);
begin
  inherited Create(self);
  FCode := TStringList.Create;
end;

også ellers som svar : 09/02-2005 14:11:37
Avatar billede martinlind Nybegynder
09. februar 2005 - 14:20 #34
og nej det er ikke svært, men jeg har jo ikke din kode foran mig og du er ikke super delphi kode haj, og jeg sidder med noget tråd kode der driller, så... nogle gange smutter det lige
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 14:21 #35
troede det var en fejl du skrev TStringList istedet for TStrings... men den vil ikke compile når det er TStringList.. så er det jo ikke den samme :/
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 14:25 #36
så lav koden i din egen delphi... bare lav et andet komponent istedt for imgview32...

hmm prøvede lige at ændre alle TStrings til TStringList, og så når jeg vil sætte komponenten på formen lukker delphi ned :/
Avatar billede hmann Nybegynder
09. februar 2005 - 14:29 #37
jeg har desværre ikke mere tid lige nu (møde venter), så giv du bare martinlind points... jeg vender lige tilbage sent i aften eller imorgen og tjekker om det kom til at virke - har også lidt meget om ørene, så undskyld hvis der har været nogle lidt-for-hurtige/mangelfulde svar ind imellem :)

og som martinlind siger - det er ikke særligt svært så 60 point er fint.. det som gør det lidt besværligt er for det første at du nedarver fra en komponent som vi ikke har/kender og for det andet lyder det til du ikke har helt styr på nogle grundlæggende principper.. men good luck og skal nok tjekke op på det senere...
Avatar billede martinlind Nybegynder
09. februar 2005 - 14:48 #38
TStringList ligger i sysutil eller classes kan ikke lige huske det, og du må lige læse op i hjælpen på hvordan og hvorfor man bruger TStrings og TStringList, det vil jeg foreslå dig at gøre for TStringList er en MEGET GUNDLÆGGENDE classe i delphi, og forøvrigt en super fed og kan bruges til 117 ting
Avatar billede espeholt_jr Nybegynder
09. februar 2005 - 15:08 #39
havde i ikke selv lavet et komponent med tstringlist/tstrings?

kan jeg ikke få en kopi af den kode?
Avatar billede hmann Nybegynder
10. februar 2005 - 08:23 #40
så er jeg tilbage... og har tid til at kigge på det :-)
der er fx en fejl her:

constructor TRealismParser.Create(aOwner:TComponent);
begin
  inherited Create(self);
  FCode := TStrings.Create;
end;

der skal stå: inherited Create(aOwner);
og så er det først når du et sted skal create din instans at du kan kalde med self, fx: RP := TRealismParser.Create(Self)

når du har created den kan du add'e linier sådan:
RP.Code.Add('dette er en test linie');
hvordan du ellers får linier ud og ind og manipulerer med dem kan du læse om i hjælpen til TStringList..

her er et lille eksempel hvor jeg nedarver fra en TEdit istedet for en TImgView32.. det skulle være let at sætte TImgView32 ind istedet:

---------
unit RealismParser;

interface

uses
  SysUtils, Classes, Controls, StdCtrls;

type
  TRealismParser = class(TEdit)
  private
    FCode: TStringList;
    Procedure SetCode(Value: TStringList);
  protected
  public
    Constructor Create(aOwner: TComponent); override;
  published
    property Code: TStringList read FCode write SetCode;
  end;

  procedure Register;



implementation

constructor TRealismParser.Create(aOwner: TComponent);
begin
  inherited create(aOwner);
  FCode := TStringList.Create;
end;

procedure Register;
begin
  RegisterComponents('Realism', [TRealismParser]);
end;

procedure TRealismParser.SetCode(Value: TStringList);
begin
  FCode.Assign(Value);
end;

end.

-------

Mvh
HMann
Avatar billede espeholt_jr Nybegynder
10. februar 2005 - 12:14 #41
takker :) giver jer 50/50... da i begge har gjort en stor indsats :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester