Entwickler-Ecke
Sonstiges (Delphi) - Problem mit eigener Komponente
elundril - Di 16.01.07 14:21
Titel: Problem mit eigener Komponente
Mein Infolehrer hat auf dem PC in der schule uns eine Komponente zur verfügung gestellt. Is eine *.Pas ohne Copyrigth hinweis. ich weiß jetzt nicht ob er das programmiert hat aber ist egal.
ich hab mir die Komponente mit nach Hause genommen und wollte learning-by-doing neue funktionen hinzufügen. in der schule hat die rohversion (ohne meinem Code) keine probs beim installieren gemacht (Delphi 3 in der Schule).
Bei mir macht die version grundsätzlich mal probleme.
mit meinem Code kommen folgende Fehlermeldungen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| [Warning] Messenger.pas(95): Property declaration references ancestor private 'TMainMessenger.FComputer' [Warning] Messenger.pas(96): Property declaration references ancestor private 'TMainMessenger.FUser' [Warning] Messenger.pas(97): Property declaration references ancestor private 'TMainMessenger.FBoxName' [Warning] Messenger.pas(98): Property declaration references ancestor private 'TMainMessenger.FInterval' [Error] Messenger.pas(181): Types of actual and formal var parameters must be identical [Error] Messenger.pas(184): Types of actual and formal var parameters must be identical [Error] Messenger.pas(472): Invalid Typecast [Fatal Error] mailsl.dpk(33): Could not compile used unit 'Messenger.pas' |
könnt ihr mir erklären was Delphi von mir will??
lg el
freak4fun - Di 16.01.07 15:21
Poste mal die Header der Methoden der Properties und die deklaration des Properties selbst. :)
MfG
freak
elundril - Di 16.01.07 15:29
meine proceduren sind in dem noch nicht wirklich ausgereift aber der rest ist fix:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477:
| unit Messenger;
interface
{$LONGSTRINGS ON} uses ExtCtrls, Windows, SysUtils, Classes,Dialogs,Graphics;
type TMainMessenger = Class; TSignalThread = class(TThread) private FMailSlot : TMainMessenger; protected procedure Execute; override; Public Constructor Create(MailSlot : TMainMessenger); end; TTimerThread = class(TThread) private FMailSlot : TMainMessenger; protected procedure Execute; override; Public Constructor Create(MailSlot : TMainMessenger); end;
TNELineArrival = Procedure (Sender : TObject;Origin,Time,Line : string) of Object; TNEMemoArrival = Procedure (Sender : TObject;Origin,Time : string;MsgLines : TStrings) of Object; TNEUserListChange = Procedure (Sender : TObject; UserList : TStrings) of Object; TNEError = Procedure (Sender : TObject;ErrorMsg : string) of object; TNETimer = Procedure (Sender : TObject) of object; TNEImage = Procedure (Sender : TObject; Origin,Time: String; MsgImage: TGraphic) of Object;
TMainMessenger = class(TComponent) private FWaitThread : TSignalThread; FTimerThread : TTimerThread; LocalHandle,RemoteHandle : THandle; ActiveFlag : Boolean; FComputer,FUser : string; Server,FBoxName,LocalPath,RemotePath : string; MaxMsgSize,MsgCount,NextMsgSize,MsgSize : DWORD; MsgType,MsgTime,MsgSender,MsgText : string; OutStrings,InStrings,UserList,MemoLines : TStringList; MsgImage: TGraphic; NewLine : String; FInterval : word; FLineArrival : TNELineArrival; FMemoArrival : TNEMemoArrival; FUserListChange : TNEUserListChange; FError : TNEError; FTimer : TNETimer; FImage : TNEImage; Procedure SendOutStrings(Recipient : string); Procedure SendOutImage(Recipient : string); Procedure SendCommand(Recipient,Command : string); Procedure AddUser(Name : string); Procedure DeleteUser(Name : string); protected Procedure DoLineArrival(Const FMSender,FMTime,FMText : string); virtual; Procedure DoMemoArrival(const FMSender,FMTime : string;MLines : Tstrings); virtual; Procedure DoUserListChange(Const CompList : TStringList); virtual; Procedure DoErrorReport(const Error : string); virtual; procedure DoImageArrival(Const FMSender,FMTime: string; FMImage:TGraphic); virtual; public Constructor Create(AOwner : TComponent); Override; Destructor Destroy; override; Procedure Activate; Procedure DeActivate; Procedure SetName(const NewName : TComponentName); override; Procedure SetBoxName(NewName : string); Procedure SetInterval(time : word); Procedure ReadMessage; Procedure ProcessCommand; Procedure SendLine(Recipient,Text : string); Procedure SendMemo(Recipient : string;Lines : TStrings); Procedure Broadcast(text : string); procedure DoTimer; Property OnNewLine : TNELineArrival read FLineArrival write FLineArrival; Property OnNewMemo : TNEMemoArrival read FMemoArrival write FMemoArrival; Property OnUserListChange : TNEUserListChange Read FUserListChange Write FUserListChange; Property OnError : TNEError read FError write FError; Property OnTimer : TNETimer read FTimer write FTimer; Property OnNewImage : TNEImage read FImage write FImage; published end;
TMessenger = class(TMainMessenger) Published Property Computer : string read FComputer; Property User : string read FUser; Property BoxName : string read FBoxName write SetBoxName; Property Interval : word read FInterval write SetInterval; Property OnNewLine; Property OnNewMemo; Property OnUserListChange; Property OnError; Property OnTimer; Property OnNewImage; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('3rdParty', [TMessenger]); end;
Constructor TSignalThread.Create(MailSlot : TMainMessenger); Begin Inherited Create(False); Priority := tpNormal; FMailSlot := MailSlot; end;
Procedure TSignalThread.Execute; Begin While Not Terminated do Begin GetMailSlotInfo(FMailSlot.LocalHandle,NIL, FMailSlot.NextMsgSize, @FMailSlot.MsgCount, NIL); If FMailSLot.MsgCount > 0 Then Synchronize(FMailSLot.ReadMessage); Sleep(1); end; end;
Constructor TTimerThread.Create(MailSlot : TMainMessenger); Begin Inherited Create(False); Priority := tpNormal; FMailSlot := MailSlot; end;
Procedure TTimerThread.Execute; Begin While Not Terminated do begin Synchronize(FMailSLot.DoTimer); Sleep(FMailslot.FInterval); end; end;
Procedure TMainMessenger.DoTimer; begin if assigned(FTimer) then FTimer(Self); end;
Constructor TMainMessenger.Create(AOwner : TComponent); var temp : array[0..255] of char; {$IFDEF VER120} len : cardinal; {$ELSE} len : Integer; {$ENDIF} Begin Inherited Create(AOwner); FBoxName := 'SignalBox'; FInterval := 1000; FWaitThread := NIL; FTimerThread := NIL; len := 255; GetComputerName(temp,len); FComputer := StrPas(temp); len := 255; GetUserName(temp,len); FUser := StrPas(temp); OutStrings := TStringList.Create; InStrings := TStringList.Create; UserList := TStringList.Create; MemoLines := TStringList.Create; end;
Destructor TMainMessenger.Destroy; begin if ActiveFlag = true then DeActivate; UserList.Free; OutStrings.Free; InStrings.Free; MemoLines.Free; inherited Destroy; end;
Procedure TMainMessenger.Activate; begin If ActiveFlag = true then begin DoErrorReport('You tried to Activate an active TMessenger component'); exit; end; FWaitThread := TSignalThread.Create(Self); if FWaitThread = nil then begin DoErrorReport('Could not Start TMessenger Timer Thread'); exit; end; FTimerThread := TTimerThread.Create(Self); Server := '.'; LocalPath := '\\' + Server + '\mailslot\' + FBoxName; LocalHandle := CreateMailSlot(PChar(LocalPath),MaxMsgSize,0,nil); if LocalHandle = INVALID_HANDLE_VALUE then begin FWaitThread.Terminate; FWaitThread := nil; FTimerThread.Terminate; FTimerThread := nil; DoErrorReport('Could not Create Mail Slot'); exit; end; SendCommand('*','ONLINE_NOTIFY'); ActiveFlag := true; end;
Procedure TMainMessenger.DeActivate; begin if ActiveFlag = false then begin DoErrorReport('Cannot Deactivate an Inactive TMessenger Component'); exit; end; if FWaitThread <> nil then begin FWaitThread.Terminate; FWaitThread := nil; end; if FTimerThread <> nil then begin FTimerThread.Terminate; FTimerThread := nil; end; CloseHandle(LocalHandle); SendCommand('*','OFFLINE_NOTIFY'); ActiveFlag := False; end;
Procedure TMainMessenger.SetName(const NewName: TComponentName); Begin Inherited SetName(NewName); end;
Procedure TMainMessenger.SetBoxName(NewName : string); begin if FBoxName <> NewName then begin FBoxName := NewName; if ActiveFlag = true then begin DeActivate; Activate; end; end; end;
Procedure TMainMessenger.SetInterval(Time : word); begin if FInterval <> Time then FInterval := Time; end;
Procedure TMainMessenger.ReadMessage; var i : integer; begin Instrings.Clear; SetLength(NewLine,NextMsgSize); ReadFile(LocalHandle,PChar(NewLine)^,NextMsgSize,MsgSize,nil); Instrings.Text := NewLine; FWaitThread.Suspend; if Instrings.Count > 3 then begin MsgType := Instrings[0]; MsgTime := Instrings[1]; MsgSender := Instrings[2]; MsgText := Instrings[3]; end; if Instrings.Count > 5 then begin MemoLines.Clear; for i := 4 to Instrings.Count - 2 do begin MemoLines.Add(Instrings[i]); end; end; if MsgType = 'COMMAND_MSG' then ProcessCommand; if MsgType = 'LINE_MSG' then DoLineArrival(MsgSender,MsgTime,MsgText); if MsgType = 'MEMO_MSG' then DoMemoArrival(MsgSender,MsgTime,MemoLines); Instrings.Clear; FWaitThread.Resume; end;
Procedure TMainMessenger.ProcessCommand; begin if MsgSender = FComputer then exit; if MsgText = 'ONLINE_NOTIFY' then begin AddUser(MsgSender); SendCommand(MsgSender,'ONLINE_RESPONSE'); end; if MsgText = 'ONLINE_RESPONSE' then AddUser(MsgSender); if MsgText = 'OFFLINE_NOTIFY' then DeleteUser(MsgSender); end;
Procedure TMainMessenger.AddUser(Name : string); var i : Integer; j : boolean; begin j := false; if UserList.Count > 0 then begin for i := 0 to UserList.Count - 1 do begin if UserList[i] = Name then j := true; end; end; if j = true then exit; UserList.Add(Name); DoUserListChange(UserList); end;
Procedure TMainMessenger.DeleteUser(Name : string); var i,Num : Integer; j : boolean; begin j := false; Num := 0; if UserList.Count > 0 then begin for i := 0 to UserList.Count - 1 do begin if UserList[i] = Name then begin j := true; Num := i; end; end; end; if j = false then exit; UserList.Delete(Num); DoUserListChange(UserList); end;
Procedure TMainMessenger.SendOutStrings(Recipient : string); var len : DWORD; begin if OutStrings.Count > 0 then begin RemotePath := '\\' + Recipient + '\mailslot\' + FBoxName; RemoteHandle := CreateFile(PChar(RemotePath),GENERIC_WRITE,FILE_SHARE_READ, nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if RemoteHandle = INVALID_HANDLE_VALUE then begin DoErrorReport('Could not Open a Remote Mail Slot'); exit; end; WriteFile(RemoteHandle,Pointer(Outstrings.text)^,Length(OutStrings.text),len,nil); OutStrings.Clear; CloseHandle(RemoteHandle); end; end;
Procedure TMainMessenger.SendLine(Recipient,Text : string); begin if Recipient = '*' then exit; Outstrings.Add('LINE_MSG'); Outstrings.Add(TimeToStr(Time)); OutStrings.Add(FComputer); OutStrings.Add(text); OutStrings.Add('END_MESSAGE'); SendOutStrings(Recipient); end;
Procedure TMainMessenger.Broadcast(text : string); begin Outstrings.Add('LINE_MSG'); Outstrings.Add(TimeToStr(Time)); OutStrings.Add(FComputer); OutStrings.Add(text); OutStrings.Add('END_MESSAGE'); SendOutStrings('*'); end;
Procedure TMainMessenger.SendMemo(Recipient : string;Lines : TStrings); var i : integer; begin if Recipient = '*' then exit; Outstrings.Add('MEMO_MSG'); Outstrings.Add(TimeToStr(Time)); OutStrings.Add(FComputer); OutStrings.Add('BEGIN_MEMO'); if Lines.Count > 0 then begin for i := 0 to Lines.Count -1 do begin OutStrings.Add(Lines[i]); end; end; OutStrings.Add('END_MESSAGE'); SendOutStrings(Recipient); end;
Procedure TMainMessenger.SendCommand(Recipient,Command : string); begin Outstrings.Add('COMMAND_MSG'); Outstrings.Add(TimeToStr(Time)); OutStrings.Add(FComputer); OutStrings.Add(Command); OutStrings.Add('END_MESSAGE'); SendOutStrings(Recipient); end;
Procedure TMainMessenger.DoLineArrival(const FMSender,FMTime,FMText : string); begin if Assigned(FLineArrival) then FLineArrival(Self,MsgSender,MsgTime,MsgText); end;
Procedure TMainMessenger.DoMemoArrival(const FMSender,FMTime : string;MLines : Tstrings); begin if Assigned(FMemoArrival) then FMemoArrival(Self,MsgSender,MsgTime,MemoLines); end;
Procedure TMainMessenger.DoUserListChange(Const CompList : TStringList); begin If Assigned(FUserListChange) Then FUserListChange(Self,CompList); end;
Procedure TMainMessenger.DoErrorReport(const Error : string); begin If Assigned(FError) Then FError(Self,Error); end;
Procedure TMainMessenger.DoImageArrival(FMSender,FMTime:string;FMImage:TGraphic); begin If Assigned(FImage) then FImage(self,MsgSender,MsgTime,MsgImage); end;
procedure TMainMessenger.SendImage(Recipient:string; SImage:TGraphic); begin if Recipient = '*' then exit; Outstrings.Add('Image_MSG'); Outstrings.Add(TimeToStr(Time)); OutStrings.Add(FComputer); MsgImage.assign(SImage); OutStrings.Add('END_MESSAGE'); SendOutImage(Recipient); end;
Procedure TMainMessenger.SendOutImage(Recipient : string); var len : DWORD; begin if OutStrings.Count > 0 then begin RemotePath := '\\' + Recipient + '\mailslot\' + FBoxName; RemoteHandle := CreateFile(PChar(RemotePath),GENERIC_WRITE,FILE_SHARE_READ, nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if RemoteHandle = INVALID_HANDLE_VALUE then begin DoErrorReport('Could not Open a Remote Mail Slot'); exit; end; WriteFile(RemoteHandle,Pointer(MsgImage)^,size(MsgImage),len,nil); OutStrings.Clear; MsgImage.Assign(nil); CloseHandle(RemoteHandle); end; end; end. |
hansa - Di 16.01.07 17:44
elundril hat folgendes geschrieben: |
..hat auf dem PC in der schule uns eine Komponente zur verfügung gestellt. Is eine *.Pas ohne Copyrigth hinweis. ich weiß jetzt nicht ob er das programmiert hat aber ist egal.
|
Fragen :
1. Wo kommen die englischen Fehlermeldungen denn her ?
2. Ist D3 in der Schule auch englisch ?
3. Welche Schule/Klasse ? Denn Komponentenentwicklung ist nicht trivial.
"Is eine *.Pas ohne Copyrigth" das deutet nicht gerade auf Eliteschule hin mit unbeschränktem Budget und kurz vor Abitur. 8)
ManniTwo - Di 16.01.07 18:28
elundril hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4:
| [Warning] Messenger.pas(95): Property declaration references ancestor private 'TMainMessenger.FComputer' [Warning] Messenger.pas(96): Property declaration references ancestor private 'TMainMessenger.FUser' [Warning] Messenger.pas(97): Property declaration references ancestor private 'TMainMessenger.FBoxName' [Warning] Messenger.pas(98): Property declaration references ancestor private 'TMainMessenger.FInterval' |
|
Nun ja, du deklarierst in der abgeleiteten TMessenger-Klasse published properties, die sich auf private Felder in TMainMessenger beziehen. Damit die abgeleitete Klasse Zugriff
auf solche Felder hat, sollten sie
protected sein und nicht
private.
elundril hat folgendes geschrieben: |
Delphi-Quelltext 1: 2:
| [Error] Messenger.pas(181): Types of actual and formal var parameters must be identical [Error] Messenger.pas(184): Types of actual and formal var parameters must be identical |
|
Genau weiß ich's an dieser Stelle auch nicht, aber wahrscheinlich ist
array of char hier nicht wirklich der richtige Datentyp für die Windows-API-Funktion oder für StrPas. Hab grad kein Delphi da.
elundril - Mi 17.01.07 13:20
hansa hat folgendes geschrieben: |
elundril hat folgendes geschrieben: | ..hat auf dem PC in der schule uns eine Komponente zur verfügung gestellt. Is eine *.Pas ohne Copyrigth hinweis. ich weiß jetzt nicht ob er das programmiert hat aber ist egal.
|
Fragen :
1. Wo kommen die englischen Fehlermeldungen denn her ?
2. Ist D3 in der Schule auch englisch ?
3. Welche Schule/Klasse ? Denn Komponentenentwicklung ist nicht trivial.
"Is eine *.Pas ohne Copyrigth" das deutet nicht gerade auf Eliteschule hin mit unbeschränktem Budget und kurz vor Abitur. 8) |
die englischen fehlermeldungen kommen von daher dass ich zuhause die Komponente weiterentwickeln will und zuhause nur D7 Pers. auf englisch habe.
Die D3 in der Schule ist nicht englisch.
AHS/8.Klasse (Ich mach dieses Jahr meinen Abschluss). Denn Komponentenentwicklung ist nicht trivial.
hansa hat folgendes geschrieben: |
"Is eine *.Pas ohne Copyrigth" das deutet nicht gerade auf Eliteschule hin mit unbeschränktem Budget und kurz vor Abitur. 8) |
versteh ich nicht was du damit aussagen willst.
lg el
hansa - Mi 17.01.07 13:55
Es ist schon etwas suspekt, dass ein englischsprachiges Programm angeblich in einer deutschen Schule vewendet wird. 8) Komponentenentwicklung setzt einiges an Wissen voraus. Und dieser Zweig ist für eine allgemeinbildende Schule eigentlich uninteressant.
Zum Thema :
Du wagst Dich auf Glatteis, sofern die Wörter private, protected usw. nicht kompett klar sind. Wenn ich eine Klasse vererbe, dann müssen/sollten die verwendeten Prozeduren die gleiche Sichtbarkeit haben und die Parameterlisten müssen/sollten übereinstimmen.
Du verwendest protected. D.h. die Methoden/Properties sind den direkten Nachfahren bekannt. Aber sonst keinem. Daher die Fehlermeldungen. Wo wirklich von Delphi "Error" und nicht "Warning" angezeigt wird, also hier :
Zitat: |
Types of actual and formal var parameters... |
das liegt an der falschen Parameterliste/Sichtbarkeit. Wird die Methode vererbt, dann kann man nicht einfach hingehen und aus dem Vorfahr, z.B.: Berechne (x : integer); beim Nachfahren ein Berechne (x,y : real); machen. Zumindest, sofern es nicht private ist.
elundril - Mi 17.01.07 14:07
in der schule haben wir eh ne deutsche version. nur halt D3.^^
Komponentenentwicklung mach ich privat.
Protected usw weiß ich was das tut nur hab ich keine Ahnung von der entwicklung von kompos. :oops: ich hab auch nirgendwo gute tuts gefunden. kennt irgendwer gute kompoentwickeln tuts??
lg el
hansa - Mi 17.01.07 14:18
Was ist denn das überhaupt :
elundril hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TMainMessenger = Class; TSignalThread = class(TThread) private FMailSlot : TMainMessenger; protected procedure Execute; override; Public Constructor Create(MailSlot : TMainMessenger); end; | |
Wie soll das gehen ? :shock: Du überschreibst per override eine protected Methode eines Vorgängers, die der gar nicht kennt. 8)
elundril - Mi 17.01.07 14:23
@freak: sry aber ist nicht gut.
@hansa: sry aber das hab nicht ich verbockt. Der grundstock ist von ?????? k.a! Ich hab nur ein bissal dazugeproggt was aber eh kompletter müll ist.
lg el
freak4fun - Mi 17.01.07 14:26
Warum ist das nicht gut? Du solltest vielleicht erstmal die Grundlagen lernen, bevor du versuchst dich an fremden (nicht gerade einfachen) Komponenten zu versuchen. Hast du vorher schonmal eine Komponente geschrieben? Es bringt dir doch auch nichts, wenn du es jetzt zum laufen bekommst, aber es nicht verstehst. :gruebel:
MfG
freak
elundril - Mi 17.01.07 14:28
verstehen!!!! du sagst es. ich versteh das tut nicht! entweder ich bin zu blöd oder es ist zu unverständlich geschrieben.
lg el
hansa - Mi 17.01.07 14:36
Das Tut bei DSDT ? Das mit dem Panel ? Gut, ist auch eher mittelmäßig, aber als Einstieg gibts kaum was zusammenhängendes. Programmiere das doch mal nach, um überhaupt ein Gefühl für die Zusammenhänge zu kriegen. In 1 Woche ist das sowieso alles auf keinen Fall hinzukriegen.
elundril - Do 18.01.07 15:30
das tutorial bei DSDT benutzt ja nur schon geerbte eingenschaften. Aner z.b: was ist wenn ich die Scrollbar mit einer onMouseUp und OnMouseDown versehen will. Da gibt es keine Eigenschaft von den Vorgängern. da muss ich alles selbst proggen und dazu gibt es kein tutorial.
lg el
elundril - Do 18.01.07 16:18
und wie kann ich dann die beiden messages in einer property vereinen??
lg el
jaenicke - Do 18.01.07 16:32
Nun ja, du solltest dir vielleicht mal irgendwelche kleinen Komponenten aus dem Netz ansehen.
Wie es zunächst mal geht ist so:
1. Du deklarierst eine neue Property
Delphi-Quelltext
1:
| property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown; |
Und das passende "Prozeduraussehen":
Delphi-Quelltext
1: 2: 3:
| type TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; |
2. Du reagierst wie eben schon gesehen auf die Botschaft:
Delphi-Quelltext
1:
| procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; |
Und dort leitest du das an die Property weiter, sofern diese eine Handler-Routine hat (eine zugewiesen, assigned, ist):
Delphi-Quelltext
1: 2: 3:
| inherited; if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); |
// EDIT: Ach so, das brauchst du auch noch (das ist so definiert, wie die Message von Windows aus aussieht; steht im PSDK):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TWMLButtonDown = packed record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end; |
So sieht das in etwas längerer Form auch im Quelltext der Delphi-Formulare aus... ;-)
elundril - Do 18.01.07 16:38
die geben nur sehr ungern ihren quellcode her.
lg el
jaenicke - Do 18.01.07 16:43
elundril hat folgendes geschrieben: |
die geben nur sehr ungern ihren quellcode her. |
Bitte???
Du bekommst im Internet doch tausende vom Komponenten inklusive Source... :rofl:
Nimm alleine die mehreren tausend bei Torry, da sind viele mit Source (FWS - Freeware With Source):
http://torry.net/pages.php?id=20
elundril - Do 18.01.07 16:49
aso das heißt FWS!!! ich hab mir immer gedacht "warum schreiben die solche hieroglyphen da hin"!!^^
danke!!!
lg el
jaenicke - Do 18.01.07 17:03
ROFLBTC
Dadrunter steht doch dann beispielsweise
Zitat: |
Fully functional
Source: Included |
Es gibt jedenfalls auch noch SW - Shareware und FW - Freeware :zwinker:
hansa - Do 18.01.07 19:07
Sieht ziemlich nach Abkupferungs-Aktion aus. Ohne irgendwelches Hindergrundwissen soll wohl irgendwas vorhandenes aus unbekannter Quelle umgefriemelt werden. 8) Und das ganze komplett ohne Verständnis von OOP. Insofern wird wohl irgendwann demnächst mit TComponent angefangen, um das Rad wenigstens komplett neu zu erfinden und nicht nur halb. :mrgreen:
BenBE - Fr 19.01.07 13:48
Der Fehler mit den Formalen Parametern in den Zeilen um 180ff basiert auf einem Typfehler ... StrPas will als Eingabe einen PChar haben ...
Man deklariere also:
Initialisiere also:
Übergebe also:
Temp^ an
GetUsername und
GetComputername
und finalisiere anschließend also:
elundril - Sa 20.01.07 15:27
ROFLBTC???? was das??
zur abkupferungsaktion: is es nicht da ich mir den source erklären lasse. und zwar von euch. :D
ich hab da jetzt was gebastelt:
Delphi hat mir immer gesagt das er Button, shift, x und y nicht kennt. deshalb hab ich sie als variable deklariert. nur:
Das OnMouseDown event wird erst beim loslassen angezeigt und das OnMouseUp event gar nicht. X und Y bleiben grundsätzlich gleich und sind zahlen die sich um die 100000 stelle drehen. was hab ich da falsch gemacht und wie muss ichs ändern??
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| unit ExScrollBar;
interface
uses SysUtils, Classes, Controls, StdCtrls, Messages;
type TSmallPoint = packed record x: SmallInt; y: SmallInt; end;
type TWMLButtonDown = packed record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end;
type TWMLButtonUp = packed record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end;
type TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
type TExScrollBar = class(TScrollBar) private Button: TMouseButton; Shift: TShiftState; X,Y: integer; FOnMouseDown: TMouseEvent; FOnMouseUp: TMouseEvent; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; protected public published property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown; property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('ExComponents', [TExScrollBar]); end;
procedure TExScrollbar.WMLButtonDown(var Message: TWMLButtonDown); begin inherited; if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); end;
procedure TExScrollbar.WMLButtonUp(var Message: TWMLButtonUp); begin inherited; if Assigned(FOnMouseUp) then FOnMouseUp(Self, Button, Shift, X, Y); end;
end. |
lg el
Sinspin - Sa 20.01.07 18:03
Das ist vollkommen klar. Denn woher soll denn die Infomation kommen die in den lokalen Variablen drinne steht? Die kommt aus dem nichts!
Die an
WMLButtonDown und
WMLButtonUp übergebe
Message enthält die benötigten Parameter die du bei aufruf mit übergeben musst. Den ShiftStatus bekommst du von der Tastatur.
Die lokalen Variablen können dementsprechend weg.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TExScrollbar.WMLButtonDown(var Message: TWMLButtonDown); begin inherited; if Assigned(FOnMouseDown) then with Message do FOnMouseDown(Self, TMouseButton(Keys), [], Pos.x, Pos.Y); end; |
Das ist aber noch nicht ausreichend. Den ShiftState habe ich erstmal komplett weg gelassen. Eigentlich braucht du den für deine Aufgabe auch nicht. Du kannst also deinen Ereignishandler "entlasten".
jaenicke - Sa 20.01.07 18:24
:oops: Hab ich aus einer weitergeleiteten Handler-Methode einfach kopiert, und habe übersehen, dass das so gar nicht deklariert ist...
So isses ganz richtig (hoffe ich):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TWMButtonEvent = packed record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TExScrollbar.WMLButtonDown(var Message: TWMButtonEvent); begin inherited; if Assigned(FOnMouseDown) then with Message do FOnMouseDown(Self, mbLeft, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExScrollbar.WMLButtonUp(var Message: TWMButtonEvent); begin inherited; if Assigned(FOnMouseUp) then with Message do FOnMouseUp(Self, mbLeft, KeysToShiftState(Keys), XPos, YPos); end; |
// EDIT: Ach so: KeysToShiftState ist aus der Unit Forms ;-)
elundril - So 21.01.07 14:24
Ok vielen danke!!!!
lg el
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!