Avatar billede dkklein Nybegynder
27. juli 2008 - 12:07 Der er 13 kommentarer og
1 løsning

TrayIcon og metoder

Jeg er ikke helt så god til hele den object orienterede del af Delphi.

Jeg har et program som kører som en service så der er ikke nogen form tilknyttet men programmet benytter class TService. Til denne service har jeg 2 timer events. I programmet har jeg en del funktioner og procedurer som ikke er tilknyttet en class.

Jeg har tilføjet et TrayIcon til mit program og nu er problemet at jeg gerne vil opdatere ballonhint når der opstår en fejl. Det kan jeg fint gøre indenfor de 2 timer events men jeg kan ikke i de funktioner er ikke er tilknyttet en class.

F.eks. har jeg proceduren

procedure DebugMSG(msglevel: integer; debug: boolean; s,logfilename: string);

Denne kaldes mange gange i de 2 timer events. Hvis msglevel er error vil jeg gerne opdatere TrayIcon med fejlmeddelelsen og vise denne.

Hvordan skal jeg tilrette mit program så jeg kan gøre dette? Istedet for at tilføje linierne for opdatering af TrayIcon efter hvert eneste kald af DebugMSG (hvilket jo vil være tåbeligt og spild).
Avatar billede psycosoft-funware Nybegynder
27. juli 2008 - 15:04 #1
hvis du vil tilgå et property, function eller procedure der er lokaliseret i en klasse skal du starte med at sætte klassens navn forand

fx hvis din TTrayIcon er placeret på din TMainForm og du vil skrive til dens BaloonHint procedure fra din DebugMsg procedure kan du gøre følgene.

procedure DebugMsg(const MsgLevel: Integer; const Debug: Boolean; const S, LogFileName: String);
begin
  ...
  TMainForm.TrayIcon1.ShowBalloonHint(DoSomething);
  ...
end;

/psycosoft-funware :)
Avatar billede dkklein Nybegynder
27. juli 2008 - 15:33 #2
Jeg får fejlen "method identifier expected" når jeg gør dette.

TrayIcon er defineret her

type
  TSMHTMLemailSvc = class(TService)
    Timer1: TTimer;
    Timer2: TTimer;
    TrayIcon1: TTrayIcon;


og jeg gør dette som giver fejlen

TSMHTMLemailSvc.TrayIcon1.BalloonHint := 'Error: '+SCerror(status1)
Avatar billede dkklein Nybegynder
27. juli 2008 - 15:34 #3
Jeg glemete et semikolon til sidst i linien.
Avatar billede dkklein Nybegynder
27. juli 2008 - 15:35 #4
Jeg mener selvfølgelig at linien ser sådan ud og giver stadig fejl

TSMHTMLemailSvc.TrayIcon1.BalloonHint := 'Error: '+SCerror(status1);
Avatar billede psycosoft-funware Nybegynder
27. juli 2008 - 16:27 #5
uden at kende til resten af din kode vil jeg mene at dit kald til BalloonHint skal se således ud:
TSMHTMLemailSvc(Self).TrayIcon1.BalloonHint := 'Error: '+SCerror(status1);

ellers vil jeg foreslå at du slå op i Delphi's Error messages and warnings og søger på:
method identifier expected  da der er flere grunde og løsninger på denne fejl.

/psycosooft-funware :)
Avatar billede dkklein Nybegynder
27. juli 2008 - 17:28 #6
Jeg har kigget i hjælp det hjælper mig desværre ikke.

Kender du eventuelt en god bog om objekt orienteret programmering ?
Avatar billede psycosoft-funware Nybegynder
27. juli 2008 - 18:33 #7
hmm jeg ville nu nok have valgt ikke at have functions/procedure svæende der ikke er bundet til nogen klasser.

type
  TSMHTMLemailSvc = class(TService)
    Timer1: TTimer;
    Timer2: TTimer;
    TrayIcon1: TTrayIcon;
  private
    {private declerations}
  public
    procedure DebugMSG(const MsgLevel: integer; const Debug: Boolean; const S, LogFileName: String);
  end;

...

procedure TSMHTMLemailSvc.DebugMSG(const MsgLevel: integer; const Debug: Boolean; const S, LogFileName: String);
begin
  TrayIcon1.BalloonHint := 'Error: '+SCerror(status1);
end;
 

jeg har selv erfaret at har man procedure og functions bundet til den klasse hvor man skal bruge dem sparer en for meget ekstra arbejde i sidste enden.

just my 2 cents...

/psycosoft-funware :)
Avatar billede dkklein Nybegynder
27. juli 2008 - 19:14 #8
Du har helt ret men jeg har som allerede nævnt ikke sårlig meget styr på den objekti orientede del.

Hvis jeg prøver ovenstående og kalder proceduren således

TSMHTMLemailSvc.DebugMSG(MSGLEVEL_INFO, debug, '*************************************************',logfilename);

Så får jeg denne fejl under compilering

[DCC Error] SMHTMLemail1.pas(127): E2076 This form of method call only allowed for class methods


Hvad er fordelen ved at sætte CONST foran de 3 af parametrene ?
Avatar billede psycosoft-funware Nybegynder
27. juli 2008 - 20:05 #9
hvis du vil kalde DebugMsg fra samme unit som TSMHTMLemailSvc er erklæret i så behøver du ikke sætte TSMHTMLemailSvc. forand. der kan du nøjes med at kalde DebugMsg med de ønskede parametre :)

fordelen ved at sætte const forand parametre navnene er at du så ikke ved et uheld kommer til at ændre des indhold. her er et eks:

procedure Dummy(const DummyName: String);
begin
  DummyName := 'test'; //dette kan ikke lade sig gøre
end;

når du kalder denne procedure vil den streng du har indsat i parametren være read-only.

hvor i mod dette kan være farligt da du vil kunne ændre på indholdet af din parametre
procedure Dummy(DummyName: String);
begin
  DummyName := 'test'; //dette kan godt lade sig gøre
end;

/psycosoft-funware :)
Avatar billede dkklein Nybegynder
27. juli 2008 - 20:44 #10
Så lykkedes det at kompilere uden fejl.

Tak for hjælpen. Skriv et svar så kan jeg give dig point.

Kendte du nogle gode bøger om objekt orienteret programmering.
Avatar billede hrc Mester
28. juli 2008 - 09:48 #11
Konceptet OOP er meget ens. Tror ikke der findes en lærebog udi Delphi-Pascal OOP, men der findes "mursten" der kommer over området.
Jeg har ikke læst meget af Marco Cantu men det har været godt (http://www.marcocantu.com). Desuden er der Xavier Pachero som har lavet mange gode bøger om Delphi (at manden kører en kvalmene religiøs, samt ditto blåøjet patriotisk linje i sine forord, skal man prøve at abstrahere - jeg kan ikke).
Avatar billede dkklein Nybegynder
28. juli 2008 - 11:11 #12
Ja det var også generelle bøger om OOP jeg efterlyste. Jeg har flere af Marco's bøger allerede.
Avatar billede psycosoft-funware Nybegynder
02. august 2008 - 00:25 #13
jeg har selv læst en del af marco's bøger og må sige at der er mange guldkorn imellem :)

>>hrc: jeg kan kun give dig ret i at Xavier's forord er til at brække sig over ;)
Avatar billede psycosoft-funware Nybegynder
02. august 2008 - 00:25 #14
svar
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