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'      //-> hab ich keine ahnung was er will
[Warning] Messenger.pas(96): Property declaration references ancestor private 'TMainMessenger.FUser'      //->hab ich auch keine ahnung was er will
[Warning] Messenger.pas(97): Property declaration references ancestor private 'TMainMessenger.FBoxName'      //->hab ich auch keine ahnung was er will
[Warning] Messenger.pas(98): Property declaration references ancestor private 'TMainMessenger.FInterval'      //->hab ich auch keine ahnung was er will
[Error] Messenger.pas(181): Types of actual and formal var parameters must be identical      //->hab ich auch keine ahnung was er will
[Error] Messenger.pas(184): Types of actual and formal var parameters must be identical      //->hab ich auch keine ahnung was er will
[Error] Messenger.pas(472): Invalid Typecast   //-> weis ich was er will aber nicht wie mans umsetzt
[Fatal Error] mailsl.dpk(33): Could not compile used unit 'Messenger.pas'   //->schon klar


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}  // Equal {$H+}

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 : stringof 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 : stringof 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

//---------- Component Registration ------------------------------------------

procedure Register;
begin
  RegisterComponents('3rdParty', [TMessenger]);
end;



//---------- Thread Procedures -----------------------------------------------

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;


//----------- Signaler StartUp/ShutDown -----------------------------------------

Constructor TMainMessenger.Create(AOwner : TComponent);
var
 temp : array[0..255of 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;


//-------------- Set Property Procedures --------------------------------------

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;


//------------- Message Retrieval Procedures ----------------------------------

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;

//------------- Message Sending Procedures ------------------------------------

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;

//----------- Event Handler Procedures ---------------------------------------

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;

//----------- Send Data Procedures ---------------------------------------
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;

//----------- Get Data Procedures ---------------------------------------
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

user profile iconelundril 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

user profile iconelundril hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
[Warning] Messenger.pas(95): Property declaration references ancestor private 'TMainMessenger.FComputer'      //-> hab ich keine ahnung was er will
[Warning] Messenger.pas(96): Property declaration references ancestor private 'TMainMessenger.FUser'      //->hab ich auch keine ahnung was er will
[Warning] Messenger.pas(97): Property declaration references ancestor private 'TMainMessenger.FBoxName'      //->hab ich auch keine ahnung was er will
[Warning] Messenger.pas(98): Property declaration references ancestor private 'TMainMessenger.FInterval'      //->hab ich auch keine ahnung was er will



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.

user profile iconelundril hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
[Error] Messenger.pas(181): Types of actual and formal var parameters must be identical      //->hab ich auch keine ahnung was er will
[Error] Messenger.pas(184): Types of actual and formal var parameters must be identical      //->hab ich auch keine ahnung was er will


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

user profile iconhansa hat folgendes geschrieben:
user profile iconelundril 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.

user profile iconhansa 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


freak4fun - Mi 17.01.07 14:18

Wie wäre es mit dsdt.info [http://www.dsdt.info/tutorials/?cat=3]? ;)

MfG
freak


hansa - Mi 17.01.07 14:18

Was ist denn das überhaupt :

user profile iconelundril 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


jaenicke - Do 18.01.07 16:14

Da ist nicht viel zu programmieren... :zwinker:
Hier siehst du bei der Frage wie das geht, darunter steht wie die Botschaften richtig heißen.
http://www.delphi-forum.de/viewtopic.php?t=62149&start=0&postdays=0&postorder=asc&highlight=&sid=e123869132e5c1ff83ca7e0565d4f098

Und das ist bei neuen Sachen dann meistens so, dass du da die entsprechenden Botschaften abfangen musst.


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

user profile iconelundril 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:

Delphi-Quelltext
1:
var Temp: PChar;                    


Initialisiere also:

Delphi-Quelltext
1:
Temp := GetMem(256);                    


Übergebe also:
Temp^ an GetUsername und GetComputername

und finalisiere anschließend also:

Delphi-Quelltext
1:
FreeMem(Temp);                    


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;
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
    property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
    { Published declarations }
  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