Bitte dringend um Hilfe!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DarkClasher
Beiträge: 7
Registriert: Do 31. Mai 2012, 17:25

Bitte dringend um Hilfe!

Beitrag von DarkClasher »

Hallo,
ich muss in einer Projektarbeit ein eigens Delphi Programm schreiben mit dem Programm lazarus.
Ich habe mich für einen Währungsumrechner entschieden und da ich in diesem Gebiet ein Anfänger bin, bekomme ich ständig Fehlermeldungen.
Der eigentliche Umrechner funktioniert, doch ich würde gerne per Button auf form1, form 2 öffnen wo ein image (das weiß ich auch net wie geht )mit einer grafik ist.
Hier der Quellcode:

Code: Alles auswählen

{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
 var Euro,Kuna:real;
begin
   Euro := StrToFloat(Edit1.Text);
   Kuna := Euro * 7.57100;
   Edit2.Text := FloatToStrF(Kuna,ffFixed,0,2);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var Form3: TForm;
begin
  Form3.show;
 
 
end;
end.


und hier der von Form2(bzw.3):

Code: Alles auswählen

unit Unit3;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TForm3 }
 
  TForm3 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form3: TForm3;
 
implementation
 
{$R *.lfm}
 
{ TForm3 }
 
 
procedure TForm3.Button1Click(Sender: TObject);
 var Form3 :TForm3
begin
  Form3.hide;
end;
end.




wo liegt der bzw die Fehler? und wie kann ich meine wünsche bei diesem Programm verwirklichen?
Ich würde mich über schnellstmögliche Hilfe freuen.

MFG
DC
Zuletzt geändert von Lori am Fr 1. Jun 2012, 19:17, insgesamt 1-mal geändert.
Grund: Highlighter

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bitte dringend um Hilfe!

Beitrag von hde »

zunächst mal bei From1 unter uses Unit2 bzw 3 eintragen ..
und dann bitte die fehlermeldungen etwas genauer.

gruß hde

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Bitte dringend um Hilfe!

Beitrag von Bora4d »

1. Beim ersten Fomr fügst du in uses Abschnitt unit3; etwa so:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, unit3;


2. Auf den 2.Form (form3) plazierst du ein TImage (in Additionalbereich)
3. Dann lädst du in IMage (mußte Image1 heißen) ein Bild.
Image1 wählen in ObjektInspektor Picture-Eingenschaft verwenden um Bild zuladen.

Dann funktioniert alles .
Viel glück.

Keifor
Beiträge: 31
Registriert: Sa 28. Aug 2010, 15:15
OS, Lazarus, FPC: pc-linux-gnu - Funtoo stable, L trunk, FPC trunk
CPU-Target: i686/x86_64

Re: Bitte dringend um Hilfe!

Beitrag von Keifor »

Lass mich raten. EAccessViolation? :mrgreen:

Guck dir deinen Quelltext nochmal genauer an. Im folgenden Abschnitt wird lediglich eine Variable mit Namen "Form3" und Typ TForm deklariert. Die Variable Form3 ist aber innerhalb der Methode nicht definiert/initialisiert.
DarkClasher hat geschrieben:procedure TForm1.Button3Click(Sender: TObject);
var Form3: TForm;
begin
Form3.show;
end;

"Form3.show" versucht hier eine Methode auf einem Objekt aufzurufen, welches nicht existiert. Die folge ist i.d.R. eine Access Violation (Speicherschutz Verletzung / Segmentation Fault / ..).

In deiner Unit3, benutzt du die selbe Variante für das Verstecken. Entsprechend Scoping (Gültigkeitsregeln) ist der Name "Form3" innerhalb der Prozedur neu und Versteckt die globale Variable welche eine Referenz auf die gewünschte Form 3 hält.
DarkClasher hat geschrieben:Form3: TForm;
...
procedure TForm3.Button1Click(Sender: TObject);
var Form3 :TForm3
begin
Form3.hide;
end;


Kurz, die Deklarationen sind überflüssig. Innerhalb von Unit3 kann "Form3" einfach verwendet werden. Innerhalb von Unit2 kann "Form3" (mit Referenz auf das gewünschte Form3 Objekt) nur genutzt werden, wenn die Variable in Unit1 erreichbar ist (siehe vorherige Kommentare, "uses unit3;" ist der Trick)

Beispiel (nur Form 1, andere lassen sich Analog lösen), Form1 mit 2 Buttons, Button1 zeigt Form2 in unit2. Button2 versteckt Form2.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
uses unit2;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.Hide;
end;
 
end.


Der korrekte Zusammenbau der Lösung (Siehe oben, eine Grafik auf einer Form ist auch nicht schwer mit TImage), bleibt dir überlassen.

PS:
"Bitte dringend um Hilfe" ist ein schlechter / nicht aussagekräftiger Titel für ein Forum Post.

DarkClasher
Beiträge: 7
Registriert: Do 31. Mai 2012, 17:25

Re: Bitte dringend um Hilfe!

Beitrag von DarkClasher »

Vielen Dank für die bisherigen Beiträge, das Bild hab ich jetzt drin doch nun ergibt sich in unit3 ein fehler:

Code: Alles auswählen

unit Unit3;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TForm3 }
 
  TForm3 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form3: TForm3;
 
implementation
 
{$R *.lfm}
 
{ TForm3 }
 
 
procedure TForm3.Button1Click(Sender: TObject);
 var Form3 :TForm3
begin
  Form3.hide;
end;
end.


begin, procedure und end sind rot makiert und die fehlermeldung lautet:

; expected but BEGIN found

jmd ne idee?
Zuletzt geändert von Lori am Fr 1. Jun 2012, 19:19, insgesamt 1-mal geändert.
Grund: Highlighter

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bitte dringend um Hilfe!

Beitrag von hde »

dann setz das ; dahin wo es angemckert wird. Das solltest du selbst herausfinden wo, sagt der fehler doch klar.

und dann hast du immer noch nicht begriffen, dass du innerhalb der Form3 diese nicht nochmals deklarieren kannst/sollst.

hde

DarkClasher
Beiträge: 7
Registriert: Do 31. Mai 2012, 17:25

Re: Bitte dringend um Hilfe!

Beitrag von DarkClasher »

Diesen Fehler habe ich trotzdem.
@hde ich habe alles begriffen, doch zu dem Fheler hier weiß ich nichts.

Fehlerquelle in Rot:"Forward declaration not solved"

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TForm3 }
 
  TForm3 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
   [color=#FF0000] procedure FormCreate(Sender: TObject);[/color]
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form3: TForm3;
 
implementation
 
{$R *.lfm}
 
{ TForm3 }
 
 
procedure TForm3.Button1Click(Sender: TObject);
begin
  Form3.hide;
end;
end.
Zuletzt geändert von Lori am Fr 1. Jun 2012, 19:20, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter verwenden

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Bitte dringend um Hilfe!

Beitrag von Bora4d »

Lösch die rote Zeile:
procedure FormCreate(Sender: TObject);

Und klicke in Formulardesigner auf form3. Dann gehe im Objejktinspektor auf Ereignisse (2.TAb) und lösche dort Oncreate-Ereignis falls vorhanden.

Du solltest das mal lesen kleines eifaches Pascalbuch:
[url]
http://www.marcocantu.com/epascal/German/default.htm
[/url]

Und das ist auch gut für dich:
http://www.delphi-treff.de/object-pascal/programmaufbau/

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bitte dringend um Hilfe!

Beitrag von hde »

DarkClasher hat geschrieben:"Forward declaration not solved"


Versuche in Zukunft deine Fehler mal genau zu lesen:

Wenn du am Anfang unter type eine function oder procedur declarierst, dann musst du sie auch in der implementation auflösen, also programmieren was diese function oder procedure denn nun tun soll.

und Bora4d hat recht, Lazarus/Pascal ist zwar einfach,aber ein wenig Grundwissen ist schon notwendig.

grus hde

DarkClasher
Beiträge: 7
Registriert: Do 31. Mai 2012, 17:25

Re: Bitte dringend um Hilfe!

Beitrag von DarkClasher »

Trotz mehrmaligem Überlegen, habe ich jedoch noch einen Fehler.
Sobald ich auf den 3. Button auf form1 klicke um form 3 zu öffnen kommt folgender Fehler:

"External SIGSEGV

und

"\include\customform.inc in zeile 2186"


Code: Alles auswählen

procedure TCustomForm.Show;
------------------------------------------------------------------------------}
procedure TCustomForm.Show;
begin
  Visible := True;
  BringToFront;
end;


Trotzdem Vielen Dank für die Links. :)
Zuletzt geändert von Lori am So 3. Jun 2012, 10:52, insgesamt 1-mal geändert.
Grund: Highlighter

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bitte dringend um Hilfe!

Beitrag von hde »

Wie sieht denn deine Procedure zu .. TForm1.Button3Click .. aus?

Ich hoffe doch , nicht mehr so?

hde hat geschrieben:procedure TForm1.Button3Click(Sender: TObject);
var Form3: TForm;
begin


denn dann schau

Keifor hat geschrieben:Guck dir deinen Quelltext nochmal genauer an. Im folgenden Abschnitt wird lediglich eine Variable mit Namen "Form3" und Typ TForm deklariert. Die Variable Form3 ist aber innerhalb der Methode nicht definiert/initialisiert.

DarkClasher hat geschrieben:procedure TForm1.Button3Click(Sender: TObject);
var Form3: TForm;
begin
Form3.show;
end;


"Form3.show" versucht hier eine Methode auf einem Objekt aufzurufen, welches nicht existiert. Die folge ist i.d.R. eine Access Violation (Speicherschutz Verletzung / Segmentation Fault / ..).

In deiner Unit3, benutzt du die selbe Variante für das Verstecken. Entsprechend Scoping (Gültigkeitsregeln) ist der Name "Form3" innerhalb der Prozedur neu und Versteckt die globale Variable welche eine Referenz auf die gewünschte Form 3 hält.


und lösch endlich diese Zeile

var Form3: TForm;


hde

DarkClasher
Beiträge: 7
Registriert: Do 31. Mai 2012, 17:25

Re: Bitte dringend um Hilfe!

Beitrag von DarkClasher »

Jetzt funktioniert soweit alles.

Ich würde jedoch gerne noch einen Sound einfügen, der bei Programmstart und wenn man auf Beenden Klickt ertönt.
was ich bisher gefunden habe ist sowas, doch ich weiß nicht wie ich das am programmstart und ende mache:



PlaySound('bang_3.wav', 0, SND_FILENAME or SND_ASYNC);

hausi
Beiträge: 132
Registriert: Mi 23. Sep 2009, 08:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitte dringend um Hilfe!

Beitrag von hausi »

Ich würde es einmail bei der Form im onCreate und im onClose versuchen.

Hauis

DarkClasher
Beiträge: 7
Registriert: Do 31. Mai 2012, 17:25

Re: Bitte dringend um Hilfe!

Beitrag von DarkClasher »

Ich habe es nun geschaft sounds einzufügen, würde aber gerne ein ganzes lied in wav-format, von buttonklick an durchlaufen lasse. Jetzt kommt jedoch immer der fehlerton.
Kann mir jmd. helfen?

Antworten