Avatar billede klasker Nybegynder
11. september 2003 - 23:10 Der er 13 kommentarer og
1 løsning

Fejl: "SyntaxEdit1 has no parent window."

Jeg har lavet et komponent der nedarver fra TRichedit, og som jeg har lavet en masse ændringer på.
Når jeg så compiler osv og prøver at placere mit komponent på en form får jeg fejlen "SyntaxEdit1 has no parent window.", og mit komponent kommer ikke på formen.

Jeg overrider følgende methods:
procedure Loaded;
procedure Change;
procedure Invalidate;
constructor Create(AOwner: TComponent);
I alle af dem kalder jeg Inherited. Det er dog værd at bemærke at Invalidate ser sådan ud:

procedure TSyntaxEdit.Invalidate;
begin
  if AllowUpdate then
    Inherited;
end;

Hvor AllowUpdate er en boolean property der sættes til True i Create metoden.

Nogen der ved hvad der kan være i vejen siden at jeg får den fejl??
Avatar billede TRoXa Novice
11. september 2003 - 23:41 #1
hvordan ser din create procedure ud ?
Avatar billede TRoXa Novice
11. september 2003 - 23:41 #2
du kan evt smide denne ind hvis du ikke allerede har den

lige efter inherited
Parent := (AOwner AS TWinControl);
Avatar billede TRoXa Novice
11. september 2003 - 23:44 #3
et lille eksempel jeg lige fandt ..

constructor TMultiLineButton.Create(AOwner: TComponent);
begin
  inherited;
  Parent := (AOwner AS TWinControl);
  SetWindowLong(Handle, GWL_STYLE,
    GetWindowLong(Handle, GWL_STYLE) OR BS_MULTILINE);
  Parent := nil
end;

som går ud på det problem du har.
Avatar billede klasker Nybegynder
12. september 2003 - 00:07 #4
Jeg satte
Parent := (AOwner AS TWinControl);
ind lige efter inherited som du foreslog, hvilket fik Delphi til at crashe istedet for at komme med en fejl. Jeg nåede at se den dukke op på min Form oppe i venste hjørne, hvorefter Delphi gik i stå og jeg måtte ALT+CTRL+DEL mig ud af det :|
Jeg prøver lige det andet eksempel.
Avatar billede klasker Nybegynder
12. september 2003 - 00:12 #5
Den siger Undeclared identifier til SetWindowLong.
Min Create methode er helt tom bortset fra inherited. Jeg har også prøvet uden den, uden forskel.
Avatar billede TRoXa Novice
12. september 2003 - 00:29 #6
kan jeg få noget kode at arbejde med så jeg kan prøve at løse problemet ?
Avatar billede klasker Nybegynder
12. september 2003 - 08:03 #7
Her er deklerationen af typerne:

  TSyntax = record
    SynWords: TStringlist;
    SynColor: TColor;
    SynStyle: TFontStyles;
    SynCaseSense: Boolean;
  end;

  TSyntaces = array of TSyntax;

  TSyntaxEdit = class(TRichEdit)
  private
    { Private declarations }

    FSyntaces : TSyntaces;
    FAllowUpdate: Boolean;
    FSyntaxFilename: string;

    function GetWordSyn(const Word: string): TSyntax;
    procedure Highlight(const Start, Len: Integer; Syn: TSyntax);
  protected
    { Protected declarations }
    procedure Loaded; override;   
    procedure Change; override;

    property AllowUpdate: Boolean read FAllowUpdate write FAllowUpdate;
  public
    { Public declarations }

    procedure Invalidate; override;
    constructor Create(AOwner: TComponent); override;
    procedure LoadSyntaxFile(const Filename: string);
    procedure SyntaxCheckAll;

  published
    { Published declarations }

    property SyntaxFilename: string read FSyntaxFilename write FSyntaxFilename;
  end;
Avatar billede klasker Nybegynder
12. september 2003 - 08:06 #8
Her er så nogle implementation bidder:

constructor TSyntaxEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

procedure TSyntaxEdit.Change;
begin
  inherited;
  SyntaxCheckAll;
end;

procedure TSyntaxEdit.Invalidate;
begin
  if AllowUpdate then
    Inherited;
end;

procedure TSyntaxEdit.LoadSyntaxFile(const Filename: string);
// Jeg springer lige et par lokale methods over her
var
  I: Integer;
  SyntaxList: TStringlist;
  CurrSyntax: TSyntax;
  SyntaxCreated: Boolean;
  Line: String;
begin
  if (SyntaxFilename <> '') and (FileExists(SyntaxFilename)) then
    begin
      SetLength(FSyntaces, 0);
      SyntaxList := TStringlist.Create;
      SyntaxList.LoadFromFile(SyntaxFilename);
      I := 0;
      SyntaxCreated := False;

      // Do with every line in the file
      while I < SyntaxList.Count do
      begin
        Line := SyntaxList.Strings[I];
        // if not comment
        if Line[1] <> ';' then
        begin
          // if new syntax
          if Line[1] = '@' then
            begin
              if SyntaxCreated then
                AddSyntax(CurrSyntax);
              CurrSyntax := NewSyntax;
              CurrSyntax.SynColor := StringToColor(SubStr(Line, 2, Length(Line)));
              SyntaxCreated := True;
            end
          else
            // Syntax word
            CurrSyntax.SynWords.Add(Line);
        end;
      end;

      if SyntaxCreated then
        AddSyntax(CurrSyntax);
      SyntaxList.Free;
    end;
end;

procedure TSyntaxEdit.Loaded;
begin
  Inherited Loaded;
  LoadSyntaxFile(SyntaxFilename);
end;
Avatar billede klasker Nybegynder
12. september 2003 - 08:08 #9
Hmm.. jeg indser pludselig at jeg har lavet en uendelig løkke LoadSyntaxFile. Jeg har rettet det nu men det ændrer ikke på mit problem :(
Avatar billede tolderlund Nybegynder
12. september 2003 - 13:01 #10
Hvis du single stepper igennem din komponent kode med debuggeren, hvilken linie er det så der giver fejlen?
Avatar billede klasker Nybegynder
12. september 2003 - 14:25 #11
Fejlen kommer så snart jeg prøver at sætte komponenten på formen! Jeg kan ikke engang starte programmet med den på. Hvis jeg trykker på SyntaxEdit og prøver at sætte den på min form i Delphi, kommer fejlen, og komponenten kommer ikke på min form
Jeg kan altså ikke engang komme til at bruge debuggeren.
Avatar billede tolderlund Nybegynder
12. september 2003 - 14:31 #12
Du kan debugge komponenten hvis du lader være med at putte den på formen, men i stedet laver en Create af den i FormCreate.
Avatar billede klasker Nybegynder
12. september 2003 - 14:57 #13
Jeg fandt fejlen, ved at udkommentere Loaded og Change hvorefter det virkede.
Fejlen gemte sig i Change
Den kørte åbenbart Change inden Loaded, så jeg måtte bare sørge for at den ikke kørte SyntaxCheckAll fra Change medmindre den var initialized.
Tak fordi du prøvede at hjælpe mig tolderlund, men jeg kan desværre ikke give dig point da du ikke besvarede mit spørgsmål.
Avatar billede tolderlund Nybegynder
12. september 2003 - 16:12 #14
Øv, jeg synes ellers jeg hjalp dig rigtig godt med at finde fejlen.
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

Seneste spørgsmål Seneste aktivitet
I går 10:21 Ny printer, men hvilken Af mort1 i Printere
13/0819:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging