Autor Beitrag
technofreak
Hält's aus hier
Beiträge: 6

Win XP
Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 10:16 
Habe ein Programm geschrieben (besserer gesagt bin noch dabei) und es läuft. Rufe beim Start das hauptfenseter und ein 2. Fenster auf, wobei das 2. nach Auswahl per RadioButton und "Weiter" gschlossen wird. Wenn ich jetzt dem Hauptfenster ein Button, Label RadioButton oder RadioButtonGroup (andere noch nicht probiert) hinzufüge und das Programm laufen lasse bricht es nach dem Schließen des 2. Fensters mit "Abstrakter Fehler" ab, eagl ob ich die Elemente noch mit Code belege oder nicht. Woran kann das liegen?

Falls jemand da was weiß würde ich mich freuen an dem Wissen teilhaben zu dürfen.

technofreak
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.12.06 10:51 
An wie viel Stellen wollen wir noch diskutieren?
www.delphipraxis.net...strakter+fehler.html
technofreak Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 10:59 
Ich hoffte damit auch die Leute zu erreichen die im anderen Forum nicht unterwegs sind.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 15.12.06 11:06 
Es ist immer praktisch zu wissen, wenn Cross-Postings existieren. Dann kann man nämlich prüfen, ob die eigene Antwort schon existiert, bzw. ob es sich noch lohnt sich Gedanken zu machen.
Verboten sind Cross-Postings nicht, aber der Hinweis erleichtert die Hilfe-Stellung.

Und ab jetzt bitte wieder zum Thema kommen.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 15.12.06 11:13 
Zeige mal die Deklarationen. Insbesondere die Köpfe der beteiligten Forms. Ansonsten wird das nichts. 8)

_________________
Gruß
Hansa
technofreak Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 11:26 
Also hier mal das Programm mit den Units.

ausblenden volle Höhe 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:
program ACA_Stop;

uses
  Forms,
  SDIMain in 'SDIMain.pas' {SDIAppForm},
  ABOUT in 'ABOUT.PAS' {AboutBox},
  V24 in 'V24.pas',
  RSCOMdec in 'RSCOMdec.pas',
  Comwahl in 'Comwahl.pas' {Form1},
  Daten in 'Daten.pas' {Form2};

{$R *.RES}

begin
  Application.Initialize;
  Application.Title := 'ACA_Stop';
  Application.CreateForm(TSDIAppForm, SDIAppForm);
  Application.CreateForm(TAboutBox, AboutBox);
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

unit Comwahl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, V24, DateUtils;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    RadioButton2: TRadioButton;
    RadioButton1: TRadioButton;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const
    baudrate  = '9600';   {Einstellungen für die}
    paritaet  = 'E';      {serielle Schnittstelle}
    datenbit  = '8';
    stopbit    = '1';

var
  Form1: TForm1;
  comparameter: string;         {String mit Comport-Parameter}
  abbruch: integer;
  ACATime: TDateTime;
  acatag: integer;
  acamonat: integer;
  acajahr: integer;
  acastunde: integer;
  acaminute: integer;
  acasekunde: integer;
  timediff: TDateTime;

implementation

{$R *.dfm}

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
  abbruch:=0;
  comparameter:='COM2: baud='+baudrate+' data='+datenbit+
          ' parity='+paritaet+' stop='+stopbit;
  abbruch:= v24open(comparameter);
  if abbruch = 0 then
    Button1.Caption := 'Beenden'
  else
    Button1.Caption := 'Weiter';
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  abbruch:=0;
  comparameter:='COM1: baud='+baudrate+' data='+datenbit+
          ' parity='+paritaet+' stop='+stopbit;
  abbruch:= v24open(comparameter);
  if abbruch = 0 then
    Button1.Caption := 'Beenden'
  else
    Button1.Caption := 'Weiter';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if  abbruch = 0 then
    Application.Terminate
  else
    begin
    sendestring:='X9N00U';        {Zeichenkette für Uhrzeit holen}
    v24senden(sendestring);
    repeat
      InString := v24lesen;
    until (length(instring) = 27and (copy(instring,1,9) = 'X027UEADY');
    val(copy(instring,10,2),acatag,fehler);
    val(copy(instring,13,2),acamonat,fehler);
    val(copy(instring,16,2),acajahr,fehler);
    acajahr :=acajahr+2000;
    val(copy(instring,20,2),acastunde,fehler);
    val(copy(instring,23,2),acaminute,fehler);
    val(copy(instring,26,2),acasekunde,fehler);
    ACATime := EncodeDateTime(acajahr, acamonat, acatag, acastunde,
                              acaminute, acasekunde, 0);
    TimeDiff := Now - acaTime;
    Form1.Free;
    end;
end;

end.


unit V24;

interface

function v24open(comparameter: string):integer;
procedure v24senden(sendestring: string);
function v24lesen: string;
procedure v24close;
function acazustand: String;

var
    sendestring: string;          {zu sendende zeichenkette}
    sendestringlaenge: integer;
    InString: String;             {vom Comport gelesene Zeichenkette}
    instringlaenge: integer;      {Länge der gelesenen Zeichenkette}
    fehler: integer;
    v24lesezeichen: Char;

implementation

uses RSCOMdec, Dialogs, SysUtils;

function v24open(comparameter: string):integer;
begin
  fehler := OPENCOM(pchar(comparameter));
  if fehler = 0 then
    showmessage('Schnittstelle nicht verfügbar!');
  v24open:=fehler;
end;

procedure v24close;
begin
  CLOSECOM();
end;

procedure v24senden(sendestring: string);
var i: integer;
begin
  sendestringlaenge:=length(sendestring);
  for i := 1 to sendestringlaenge do
    begin
    SENDBYTE(ord(sendestring[i]));
    end;
end;

function v24lesen: string;
var v24lesestring:string;
begin
  repeat
    v24lesezeichen := chr(READBYTE);
  until v24lesezeichen = 'X';
  repeat
                v24lesestring := v24lesestring+v24lesezeichen;
    v24lesezeichen := chr(READBYTE);
  until IntToHex(ord(v24lesezeichen),2) = 'FF';
  result:= v24lesestring;
end;

function acazustand: String;
begin
  sendestring:='X9N00Z';        {Zeichenkette für Zustandsabfrage}
  v24senden(sendestring);
  InString := v24lesen;
  val(copy(instring,2,3),instringlaenge,fehler);
  acazustand:=copy(instring,1,instringlaenge);
end;

end.


unit SDIMain;

interface

uses Windows, Classes, Graphics, Forms, Controls, Menus,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList,
  StdActns, ActnList, ToolWin, V24, RSCOMdec, LMDControl,
  LMDBaseControl, LMDBaseGraphicControl, LMDGraphicControl,
  LMDClock, Comwahl, SysUtils, LMDCustomButton, LMDButton;

type
  TSDIAppForm = class(TForm)
    ToolBar1: TToolBar;
    ToolButton9: TToolButton;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    StatusBar: TStatusBar;
    ButtonMess: TButton;
    LabelBefehl: TLabel;
    ButtonKalib: TButton;
    ButtonKalibMess: TButton;
    ButtonSpuel: TButton;
    ButtonEntlueft: TButton;
    ButtonZustand: TButton;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    FileNewItem: TMenuItem;
    FileOpenItem: TMenuItem;
    FileSaveItem: TMenuItem;
    FileSaveAsItem: TMenuItem;
    N1: TMenuItem;
    FileExitItem: TMenuItem;
    Edit1: TMenuItem;
    CutItem: TMenuItem;
    CopyItem: TMenuItem;
    PasteItem: TMenuItem;
    Help1: TMenuItem;
    HelpAboutItem: TMenuItem;
    ActionList1: TActionList;
    FileNew1: TAction;
    FileOpen1: TAction;
    FileSave1: TAction;
    FileSaveAs1: TAction;
    FileExit1: TAction;
    EditCut1: TEditCut;
    EditCopy1: TEditCopy;
    EditPaste1: TEditPaste;
    HelpAbout1: TAction;
    ImageList1: TImageList;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    LabelZustand: TLabel;
    LabelZeitPC: TLabel;
    LabelZeitACA: TLabel;
    Timer1: TTimer;
    ButtonFastlynx: TButton;
    ButtonDaten: TButton;
    procedure ButtonDatenClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ButtonFastlynxClick(Sender: TObject);
    procedure ButtonEntlueftClick(Sender: TObject);
    procedure ButtonKalibMessClick(Sender: TObject);
    procedure ButtonKalibClick(Sender: TObject);
    procedure ButtonMessClick(Sender: TObject);
    procedure ButtonZustandClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ButtonSpuelClick(Sender: TObject);
    procedure FileNew1Execute(Sender: TObject);
    procedure FileOpen1Execute(Sender: TObject);
    procedure FileSave1Execute(Sender: TObject);
    procedure FileExit1Execute(Sender: TObject);
    procedure HelpAbout1Execute(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  SDIAppForm: TSDIAppForm;
  sendestring: string;          {zu sendende zeichenkette}
  pcjahr: string;
  pcmonat: string;
  pctag: string;
  pcstunde: string;
  pcminute: string;
  pcsekunde: string;
  TimePC: string;
  DatePC: string;
  timeaca: string;
  dateaca: string;

implementation

uses about, Daten;

{$R *.dfm}

procedure TSDIAppForm.FileNew1Execute(Sender: TObject);
begin
  { Nichts ausführen }
end;

procedure TSDIAppForm.FileOpen1Execute(Sender: TObject);
begin
  OpenDialog.Execute;
end;

procedure TSDIAppForm.FileSave1Execute(Sender: TObject);
begin
  SaveDialog.Execute;
end;

procedure TSDIAppForm.FileExit1Execute(Sender: TObject);
begin
  Close;
end;

procedure TSDIAppForm.HelpAbout1Execute(Sender: TObject);
begin
  AboutBox.ShowModal;
end;

procedure TSDIAppForm.FormDestroy(Sender: TObject);
begin
  CLOSECOM();
end;

procedure TSDIAppForm.ButtonZustandClick(Sender: TObject);
begin
  labelZustand.Caption:=acazustand;
end;

procedure TSDIAppForm.ButtonMessClick(Sender: TObject);
begin
  sendestring:='X9N00A';
  v24senden(sendestring);
  labelZustand.Caption:=acazustand;
end;

procedure TSDIAppForm.ButtonKalibClick(Sender: TObject);
procedure TSDIAppForm.ButtonKalibMessClick(Sender: TObject);
procedure TSDIAppForm.ButtonSpuelClick(Sender: TObject);
procedure TSDIAppForm.ButtonEntlueftClick(Sender: TObject);
procedure TSDIAppForm.ButtonFastlynxClick(Sender: TObject);
begin
  sendestring:='X9N00T';        {Zeichenkette für Fastlynx starten}
  v24senden(sendestring);
  CLOSECOM();
  labelZustand.Caption:='FastLynx';
  MessageDlg('FastLynx-Slavemodus auf Messgerät gestartet.'+#10#13+
       'Nach der Dateiübertragung den Slavemodus über'+#10#13+
       'FastLynx beenden, und dann auf "OK" klicken.',
        mtInformation,[mbOK],0);
  v24open(comparameter);
  labelZustand.Caption:=acazustand;
end;

procedure TSDIAppForm.Timer1Timer(Sender: TObject);
begin
  TimePC := TimeToStr(Now);
  DatePC := DateToStr(Now);
  labelZeitpc.Caption := 'Zeit PC'+#10#13+TimePC+#10#13+DatePC;
  timeACA := TimeToStr(now-Timediff);
  dateaca := Datetostr(now-timediff);
  labelZeitACA.Caption := 'Zeit ACA'+#10#13+timeaca+#10#13+dateaca;
end;

end.



Die Proceduren welche ohne Inhalt dastehen sind wie TSDIAppForm.ButtonMessClick nur mit anderem Sendestring.
Hoffe das hilft weiter.

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt
technofreak Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 11:29 
Mist der hat die Tabs im Code entfernt, hoffe man kanns trotzdem noch lesen.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 15.12.06 11:49 
Sieh mal einer an. :D Du benutzt viele Fremdkomponenten. Genau für die ist abstract gedacht. Um z.B. nur die DCU's ohne PAS usw. zu verkaufen und dem Programmierer trotzdem einiges an Freiheit zu lassen. Es gibt allerdings Leute, die bauen das sogar in eigene Programme ein. 8) Diese compilierten Units müssen nur ihre eigene Parameterliste kennen und stehen lediglich oben im Interface-Abschnitt. Im Prinzip sind sie nicht vorhanden. Damit nun niemand vergisst, diesen auch einen realen Sinn zu geben, wird im Falle einer vergessenenen konkreten Implementierung (also "unten") dieser abstrakte Fehler erzeugt.

Was ist zu tun ? Ohne vorliegenden KOMPLETTEN Quelltext : tja, Handbuch nochmals gut lesen. Mit komplettem (Fremd-)Quelltext : am besten mit grep nach "abstract" suchen. Sollte da was vorhanden sein und die entspechende Methode ist in Deinem Programm noch nicht vorhanden, dann muss sie da rein. Aber Achtung ! Es ist nicht unüblich, einen gewisssen Quelltext-Anteil mitzuliefern, aber nicht alles. Sollte in dem bereits vorcompilierten Teil etwas abstract definiert sein, dann nützt auch kein grep mehr was.

_________________
Gruß
Hansa
technofreak Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 12:11 
So viele Units nutz ich garnicht. Hat delphi bei der Inst. von z.B. LMDTools automatisch eingefügt.

Habe mal alles rausgeschmissen was ich nicht nutze jetzt gehts.
Danke, scheint geholfen zu haben. Werd die Frage damit mal als beantwortet kennzeichnen.
Falls wieder Probleme auftreten weiß ich ja wo mir geholfen wird.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 15.12.06 12:39 
Und warum es plötzlich geht ist egal, oder wie ? :shock: Die Ursache liegt IMHO zu 90 % am Rumpf irgendeiner beteiligten Unit. Dort wird eine lediglich abstrakte (also nicht definierte) Methode aufgerufen. Dies geschieht alleine schon durch das Vorhandensein dieser Unit in einer beteiligten Uses-Liste. Nebenbei bemerkt : das ist die übliche Methode, für Trials usw. Z.B. Splashscreens, die man nicht wegkriegt, weil gerade die für den Splashscreen verantwortliche Unit nur als DCU vorliegt. :lol:

_________________
Gruß
Hansa
technofreak Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 12:53 
Die Ursache, warum das nich ging is mir ja jetzt klar, aber ich benutze ja keine Unit welche den Fehler verursacht.
Darum ging es ja auch nachdem ich alle Units rausgeschmissen habe, welche ich eigentlich gar nicht nutzen wollte, welche aber bei der Installation von den Tools (wie z.B. LMDTools) automatisch in mein Programm eingefügt wurden.

Und warum soll ich mich mit dem Inhalt von Units beschäftigen, welche ich gar nicht benutze. Falls der Fehler auftritt wenn ich eine Unit benutze, dann muß ich auch dafür sorgen die Methoden zu implementieren.
Trotzdem nochmals Danke für die Hilfe.