Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wo ist der Fehler ? (https://www.delphipraxis.net/135731-wo-ist-der-fehler.html)

PsTo 16. Jun 2009 20:17


Wo ist der Fehler ?
 
Sobald ich in meinem programm ein Opendialog ausführe, und dieses in einem label anzeige, und danach auf MainMenu gehe und klicke, schliesst sich das programm

Delphi-Quellcode:
procedure TForm1.Image4Click(Sender: TObject);
begin
Form1.OpenDialog1.Execute;
Form1.sPanel1.Caption:=Form1.OpenDialog1.Filename;
end;
weiss jemand hilfe? finde den fehler nicht

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

divBy0 16. Jun 2009 20:24

Re: Wo ist der Fehler ?
 
besser ist:

Delphi-Quellcode:
procedure TForm1.Image4Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    sPanel1.Caption := OpenDialog1.Filename;
end;
Was ist denn in MainMenu deklariert?

PsTo 16. Jun 2009 20:27

Re: Wo ist der Fehler ?
 
Zitat:

Zitat von divBy0
besser ist:

Delphi-Quellcode:
procedure TForm1.Image4Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    sPanel1.Caption := OpenDialog1.Filename;
end;
Was ist denn in MainMenu deklariert?

Danke. Habs mal geändert im code, problem bleibt aber weiterhin.
Also das Mainmenu ist unverändert, und beinhaltet nur zwei Menuteile mit paar unterordnern, wobei keines dieser ein event enthält

quendolineDD 16. Jun 2009 20:37

Re: Wo ist der Fehler ?
 
Schließt sich das Programm mit einer Fehlermeldung? Und wenn ja, mit welcher?
Ansonsten, wie ist das MainMenu implementiert?

PsTo 16. Jun 2009 20:41

Re: Wo ist der Fehler ?
 
Zitat:

Zitat von quendolineDD
Schließt sich das Programm mit einer Fehlermeldung? Und wenn ja, mit welcher?
Ansonsten, wie ist das MainMenu implementiert?

Nein, es erscheint keine fehlermeldung. das programm schliesst einfach ohne ton oder meldung.
Das Mainmenu allgemein geht aber (auch nach dem drücken anderer buttons im code), es ist nur nach dem opendialog wo es sich schliesst.
Also Habe mainmenu nur als komponente in die form genommen, unter type oder im code wird mainmenu nirgendwo benutzt.

quendolineDD 16. Jun 2009 21:03

Re: Wo ist der Fehler ?
 
Poste mal den ganzen Quelltext. Bisher ist nicht ersichtlich woher die unerwartete Reaktion stammt.

PsTo 16. Jun 2009 21:17

Re: Wo ist der Fehler ?
 
Also die anderen proceduren gehen. die blocken mainmenu nicht, das habe ich schon durchgetestet.
Ebenfalls seltsam ist, dass ich eben meinmenu neu reingemacht habe, ohne unterseiten, da gings, und mit unterseiten gehts wieder nicht mehr.
sollte es am schluss wirklich keine lösung mehr geben, werde ich trotzdem mal quellcode reinmachen.
die prozedur image4click beinhaltet jedoch nur die beiden zeilen, und n dieser liegt es demnach.

edit: der fehler liegt weder am untermenu des mainmenu, oder am opendialog.execute :S

divBy0 16. Jun 2009 21:20

Re: Wo ist der Fehler ?
 
Hast du vielleicht eine Actionlist auf der Form, die mit dem Mainmenu verknüpft ist?

Welche Delphiversion benutzt du?

PsTo 16. Jun 2009 21:23

Re: Wo ist der Fehler ?
 
Zitat:

Zitat von divBy0
Hast du vielleicht eine Actionlist auf der Form, die mit dem Mainmenu verknüpft ist?

Welche Delphiversion benutzt du?

Könntest du mir das mit der actionlist genauer erklären?
ich nutze delphi 7

divBy0 16. Jun 2009 21:28

Re: Wo ist der Fehler ?
 
Schau am besten mal in der OH nach, da ist die TActionlist gut erklärt.

Aber wenn du keine drauf hast, kann es daran nicht liegen. Zeig doch einfach mal den Code.

PsTo 16. Jun 2009 21:39

Re: Wo ist der Fehler ?
 
Naja, mache es net gerne, aber gut. hier der source
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, sSkinManager, Menus, StdCtrls, sButton, sEdit, acPNG, ExtCtrls,
  sLabel, sPanel, ComCtrls, sTrackBar, Registry, sMemo, Shellapi,
  DynamicSkinForm, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    sSkinManager1: TsSkinManager;
    OpenDialog1: TOpenDialog;
    sLabel1: TsLabel;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    sPanel1: TsPanel;
    sLabel2: TsLabel;
    sTrackBar1: TsTrackBar;
    Image1: TImage;
    Image5: TImage;
    sLabel3: TsLabel;
    Label1: TLabel;
    Label2: TLabel;
    sMemo1: TsMemo;
    MainMenu1: TMainMenu;
    test1: TMenuItem;
    test2: TMenuItem;
    procedure Image4Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure sTrackBar1Change(Sender: TObject);
    procedure Image5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    function GetApplicationDirectory: string;
  end;

var
  Form1: TForm1;
  DATFILE: array[1..100] of string;
  I, C:integer;


implementation


{$R *.dfm}


function TForm1.GetApplicationDirectory: string;
begin
  Result := ExtractFilePath(ParamStr(0)) + 'Easy Start Loader.exe';
end;

procedure TForm1.Image2Click(Sender: TObject);
var sl: TStringlist;
    J,K:integer;
    regist, auto: TRegistry;
    PLACED,PLACE:string;
begin
  // BATCH DATEI GETT GESCHRIWWEN
  sl := TStringlist.Create;
  try
    sl.Add('@echo off');
    for J:=1 to C do
    begin
      sl.Add('start ' + chr(34) + chr(34) + ' ' + chr(34) + DATFILE[J] + chr(34));
    end;
    sl.SaveToFile('C:\EasyStartTimer.bat');
  finally
    sl.Free;
  end;
  // ------------------------------------------

  // REGISTRY WERT GETT GESCHRIWWEN
  regist:=TRegistry.Create;
  try
    regist.RootKey:=HKEY_CURRENT_USER;
    regist.OpenKey('Software\Easy Start Timer\StartTime', true);
    regist.WriteInteger('Time',round(Form1.sTrackBar1.Position));
  finally
    regist.free;
  end;
  // ------------------------------------------

  // LOADER GETT KOPEIERT
  PLACED:=GetApplicationDirectory;
  PLACE:= 'C:\Easy Start Loader.exe';
  copyfile(PChar(PLACED),PChar(PLACE),false);
  // ------------------------------------------

  // Loader gett an den autostart gesaat.
  auto:=TRegistry.Create;
  try
    auto.RootKey:=HKEY_LOCAL_MACHINE;
    auto.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
    auto.writestring('Easy Start Loader','C:\Easy Start Loader.exe');
  finally
    auto.free;
  end;
  // ------------------------------------------
 
  for K:=1 to C do
  begin
    DATFILE[K]:='';
  end;
  Form1.sMemo1.Text:= Form1.sMemo1.Text + 'Activated ! Look Log for more Details.' + #13#10;
end;

procedure TForm1.Image4Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    sPanel1.caption := OpenDialog1.Filename;
end;

procedure TForm1.Image3Click(Sender: TObject);
var TMP:string;
begin
  if (Form1.sPanel1.Caption <> '') and (Form1.sPanel1.Caption <> TMP) then
  begin
    TMP:=Form1.sPanel1.Caption;
    Form1.sMemo1.Text:= Form1.sMemo1.Text + Form1.sPanel1.Caption + #13#10;
    DATFILE[I]:=Form1.sPanel1.Caption;
    inc(C);
    inc(I);
  end;
end;

procedure TForm1.sTrackBar1Change(Sender: TObject);
begin
  Form1.Label1.Caption:=FloatToStr(Form1.sTrackBar1.Position);
end;

procedure TForm1.Image5Click(Sender: TObject);
var regist, auto, key: TRegistry;
    J:integer;
begin
  // Registry Werter gin gelöscht
  regist:=TRegistry.Create;
  try
    regist.RootKey:=HKEY_CURRENT_USER;
    regist.OpenKey('Software\Easy Start Timer\StartTime', true);
    regist.DeleteValue('Time');
  finally
    regist.free;
  end;

  key:=TRegistry.Create;
  try
    key.RootKey:=HKEY_CURRENT_USER;
    key.OpenKey('Software', true);
    key.DeleteKey('Easy Start Timer\Starttime');
    key.DeleteKey('Easy Start Timer');
  finally
    key.free;
  end;

  auto:=TRegistry.Create;
  try
    auto.RootKey:=HKEY_LOCAL_MACHINE;
    auto.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
    auto.DeleteValue('Easy Start Loader');
  finally
    auto.free;
  end;

  // Dateien gin gelöscht.
  Deletefile('C:\EasyStartTimer.bat');
  Deletefile('C:\Easy Start Loader.exe');
  for J:=1 to C do
  begin
    DATFILE[J]:='';
  end;
  C:=0;
  Form1.sMemo1.Text:= Form1.sMemo1.Text + 'Deactivated ! Look Log for more Details.' + #13#10;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  I:=1;
  C:=0;
end;



end.

SirThornberry 16. Jun 2009 22:21

Re: Wo ist der Fehler ?
 
Könntest du bitte dem Thema einen aussagekräftigen Titel geben? Danke :)

Was mir als erstes in deinem Quelltext auffällt ist das du innerhalb der Klasse TForm1 auf die Variable Form1 zugreifst obwohl alles danach aussieht das du von der aktuellen TForm1 die Daten ändern willst. Lass das vorangestellte TForm1 einfach weg wenn du auf die Klasse selbst zugreifst denn niemand versichert dir das die Instanz immer Form1 heißt.

PsTo 16. Jun 2009 22:31

Re: Wo ist der Fehler ?
 
Zitat:

Zitat von SirThornberry
Könntest du bitte dem Thema einen aussagekräftigen Titel geben? Danke :)

Was mir als erstes in deinem Quelltext auffällt ist das du innerhalb der Klasse TForm1 auf die Variable Form1 zugreifst obwohl alles danach aussieht das du von der aktuellen TForm1 die Daten ändern willst. Lass das vorangestellte TForm1 einfach weg wenn du auf die Klasse selbst zugreifst denn niemand versichert dir das die Instanz immer Form1 heißt.

tschuldigung, mir war kein besseren titel eingefallen.

Das mit dem TForm werd ich mir merken, danke :)
werde den code am ende sowieso noch einmal ganz überarbeiten.
wollte ihn deshalb auch nicht posten, weil er noch nicht sauber ist.
halt "blockiert" mich momentan das mit dem mainmenu.

edit: meinst du das TForm1 vor einer prozedur oder Form1 vor einer komponente ?
Falls du das TForm1 vor einer prozedur meinst, das kommt automatisch von delphi aus.

Satty67 16. Jun 2009 22:36

Re: Wo ist der Fehler ?
 
Sind ja noch keine Aktionen im MainMenu definiert. Nur falls doch irgendein Event verbunden ist... schmeiße Mainmenu nochmal vom Formular runter und setze es anschließend neu auf das Formular.

wegen TForm1, das war anders gemeint:
Delphi-Quellcode:
procedure TForm1.TuWas(a : integer);
begin
  Form1.sPanel.Caption := 'test'; // <- Unsicher

  sPanel.Caption := 'test'; // <- Sicher
  //weil intern so behandelt;
  self.sPanel.Caption := 'test';
end;

quendolineDD 16. Jun 2009 22:38

Re: Wo ist der Fehler ?
 
Er meinte die Verwendung von TForm in den Prozeduren. Weil dies wird nicht beim Ändern des Formnamens gleich von Delphi mitgeändert.
Ich persönlich kann in dem Quelltext nichts finden, was dein Problem erklärt.

Lannes 16. Jun 2009 22:48

Re: Wo ist der Fehler ?
 
Hallo,

eventuell durch den SkinManager :gruebel:

PsTo 16. Jun 2009 23:07

Re: Wo ist der Fehler ?
 
Zum TForm, habs verstanden, klingt auch logisch :) dankesehr.

Zum skin, nein, ist nicht möglich, da ich die MainMenu komponente von delphi genommen habe ;)

Zum Event, ich hatte vorher ein event in einem untermenu drin gemacht, aber das ist jetzt weg weil ich die komponente schon neu reingemacht hatte. deshalb heisst er im code jetzt auch "test".

Edit: gibt es keine alternative zum mainmenu ?

divBy0 17. Jun 2009 08:30

Re: Wo ist der Fehler ?
 
Auf den ersten Blick ist mir im Code auch nichts aufgefallen. Das TMainMenu funktioniert schon, daran kann es nicht liegen. Nimm' doch mal das Skin-Dingens raus.

PsTo 17. Jun 2009 14:17

Re: Wo ist der Fehler ?
 
Hab mal ein test program geschrieben mit opendialog und mainmenu, da funktionierts einwandfrei.

edit: neue erkenntis. Lannes hatte recht
wenn ich den skinmanager rausnehme, dann geht das mainmenu.
Hier mal ein screenshot vom object inspector des managers
http://img16.myimg.de/xyyxxce110f.jpg
ist da eventuell etwas falsch eingestellt ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz