AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit OpenDialog

Ein Thema von xi.xi · begonnen am 20. Jan 2010 · letzter Beitrag vom 17. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#1

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11:40
@ xZise
warum einen neuen Thread aufmachen, wenn der hier genau meinen Fehler anspricht??? Und gelöst war der hier auch nicht, da man immer eine zu ungenaue Fehlerbeschreibung reinsetzt.
Bei meinen Programmen ist Form1 immer da , das verschwindet nur wenn ich das Programm schließen will. Aber ist schon gut Jungs, ihr habt halt mehr Ahnung von der Materie... da merke ich erstmal wie Noobig doch mein Wissen ist, aber für meine Bedürfnisse reichts.

@Bbommel
Tja ich habe mir es so angewöhnt, weil ich meist eine Procedure über eine Komponente schreibe (Bsp: Button1Click...) und dann merke, dass ich die hier angewanden Sachen doch auch noch hier und da gerne automatisch machen würde. Jetzt mal ein kleines aktuelles Beispiel: ein Sortieren Button, der meine Tabelle alphabetisch sortiert. Der Button ist auf Form1 und die Tabelle auch, dann ist mir schon klar, dass ich "form1." einfach weglassen kann.
Aber warum nen Button lassen, wenn man es doch immer automatisch (nach einer änderung des Tabelleninhalts) machen kann. Also Button weg und ne übergreifende "procedure sortieren" her. Wenn dort jetzt "form1." fehlt ists auch blöd.

Zitat:
denn wahrscheinlich wäre es sinnvoll, diese auch als Methode von TForm1 umzusetzen
Also sollte ich eine solche allgemeine "procedure sortieren" (aufgeführt unter Var) dann eher hier einsetzen, aber WIE?
Code:
 
  type
  Speicherort=record
    pfad: string[255];
    end;
  TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   ...
   ...
   ...
   procedure PageControl1Change(Sender: TObject);
   ??????HIER HIN??????????????
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Einfach "procedure sortieren" geht dann ja nicht mehr, da müssten ja noch Werte in Klammern dahinter, weiß halt nur nicht welche


Ist jetzt aber nun wirklich etwas Offtopic...

Geändert von maddin1502 (15. Jun 2010 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11:50
Zitat:
denn wahrscheinlich wäre es sinnvoll, diese auch als Methode von TForm1 umzusetzen
Also sollte ich eine solche allgemeine "procedure sortieren" (aufgeführt unter Var) dann eher hier einsetzen, aber WIE?
Genau so war es von mir gemeint. Deine deine neue Sortier-Prozedur ist ja auch genau für das TForm1 weil diese dessen Funktionalität erweitert und auf dem Form immer eine Liste sortiert. Du baust sie dann so ein:
Delphi-Quellcode:
  type
  Speicherort=record
    pfad: string[255];
    end;
  TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   ...
   ...
   ...
   procedure PageControl1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Sortieren;
  end;

[...]

procedure TForm1.Sortieren;
begin
  [...]
end;
Parameter brauchst du für die Prozedur nicht zwingend - nur dann, wenn du mit den Parametern auch etwas machst, genau wie in jeder anderen Prozedur auch.

Du könntest die Prozedur auch in den Private-Bereich einbauen. Das hängt dann davon ab, ob du möchtest, dass "fremde" Forms darauf zugreifen dürfen (public) oder nicht (private).

Bis denn
Bommel
  Mit Zitat antworten Zitat
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#3

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 12:16
Ach ja so war das. Habe nicht mehr gewusst, dass es unter public oder privat muss. Hatte ich mal in der Schule, aber leider wieder vergessen.

Wo wir gerade bei CreateForm usw waren (ich weiß nicht ob man das dazu braucht). Gibts eine Möglichkeit das MainForm zu schließen und hinter wieder zu öffnen? Mal ein Beispiel was ich zurzeit gerade brauche. Ich möchte einen "Neu" Button anlegen, der alles wieder so Zurücksetzt, wie es beim Öffnen des Programms war. Gibts da eine einfache und schnelle Methode dafür (Form1 neu laden/kreieren/erstellen oder so)? Ich könnte auch allen Inhalt der Tabellen löschen und manuell alles zurücksetzen, wäre aber keine elegante Lösung.
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#4

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 18:09
@maddin1502:
1.
um auf Post #19 zurückzukommen:
Zitat:
Ich nutze es immer so, weil nun mal der Opendialog auf Form1 liegt
...
(heißt ja nun auch nicht TForm1.oeffnen)...
Der Opendialog liegt nicht auf Form1, sondern gehört zum Objekt TForm1. Jedesmal wenn du eine Instanz von TForm1 erzeugst d.h. den Speicher für das Objekt bereitstellst und und und,
Das machst du mit:
Application.CreateForm(TForm1, Form1); dann wird in dieser Instanz auch ein neuer Opendialog erzeugt. Das ist ja gerade der Witz an OOP.

Dein erstens Posting kann nicht funktionieren weil:
form1.OpenDialog1.Execute heist: du willst den OpenDialog1 aus der Variable form1 ausführen. In der Deklaration ist der OpenDialog1 aber privat:
Delphi-Quellcode:
  TForm1 = class(TForm)
    ...
    OpenDialog1: TOpenDialog;
    ...
Daher kein Zugriff. Ist ja auch so gewollt.

2. zu #26:
Das ist nun wirklich ein neuer Thread, aber um die Frage zu beantworten.
Nein, du kannst kein Objekt zerstören und dann aus dem zerstörten Objekt heraus sichselber wieder aufmachen. Denk' mal drüber nach!!! Das einzig was du machen kannst, was aber noch unsauberer ist, du kannst ein Objekt erzeugen, dann dein MainForm schließen und es dann von dem Objekt wieder öffnen lassen. ABER:
Du solltes immer eine Inizialisierungsmethode schreiben die alles wohldefiniert anfangen lässt.

Gruß David
  Mit Zitat antworten Zitat
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#5

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 20:18
@David Martens
Ich will jetzt nicht klugscheißen, aber bei mir geht das mit dem "form1.opendialog1.execute".
Habs gerade nochmal mit einen meiner älteren Programme getestet:

Code:
if form1.opendialog1.Execute then
begin
        assignfile(f,form1.opendialog1.FileName);
        reset(f);
        if filesize(f)>0 then
        begin
        read(f,ergebnisse);
        form1.StringGrid1.ColCount:=strtoint(ergebnisse.zellen[0]);
                for i:=1 to (stringgrid1.RowCount) do
                begin
                        inhalt:=ergebnisse.Zellen[i];
                        for j:=1 to (stringgrid1.ColCount-1) do
                        begin
                                if pos('/',inhalt)=0 then
                                begin
                                stringgrid1.Cells[j,i-1]:=Inhalt;
                                end;

                                if pos('/',inhalt)>0 then
                                begin
                                stringgrid1.Cells[j,i-1]:=copy(inhalt,1,pos('/',inhalt)-1);
                                delete(inhalt,1,pos('/',inhalt));
                                end;
                        end;
                end;
        end;
        closefile(f);
end;
Vielleicht liegt es daran, dass meine Programme einfacher strukturiert sind. Das mit dem "Objekt orientiert Programmieren" versteh ich immer noch nicht so genau, will einfach nicht in meine Rübe rein, was das nun genau heißt.

Zitat:
Nein, du kannst kein Objekt zerstören und dann aus dem zerstörten Objekt heraus sichselber wieder aufmachen. Denk' mal drüber nach!!!
Das ist mir schon klar, dass ein zerstörtes Objekt sich nicht selber weiderherstellen kann. Zu dem Punkt wo der Wiederherstellungsbefehl kommen müsste, gibts ja nichts mehr, wo dieser Befehl stehen könnte (Der wäre dann auch mit zerstört).
Aber jetzt mal rein theoretisch, könnte sich ein Form selbst nochmal aufrufen? Ist jetzt so gedacht, dass man zuerst einen "Zwilling" öffnet und das alte Form dann schließt.

Geändert von maddin1502 (15. Jun 2010 um 20:22 Uhr)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#6

AW: Problem mit OpenDialog

  Alt 17. Jun 2010, 14:45
ok, nochmal fürs Verständnis: versuch es mal hiermit http://www.delphi-treff.de/object-pa...torientierung/
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#7

AW: Problem mit OpenDialog

  Alt 17. Jun 2010, 15:01
Hi David,

auch wenn wir jetzt ein bisschen weg vom Thema sind, muss ich deinen vorletzten Post doch noch mal korrigieren, sonst ist der arme Maddin ganz verwirrt und wundert sich, warum seine Programme überhaupt funktionieren.

Dein erstens Posting kann nicht funktionieren weil:
form1.OpenDialog1.Execute heist: du willst den OpenDialog1 aus der Variable form1 ausführen. In der Deklaration ist der OpenDialog1 aber privat:
Delphi-Quellcode:
  TForm1 = class(TForm)
    ...
    OpenDialog1: TOpenDialog;
    ...
Daher kein Zugriff. Ist ja auch so gewollt.
Was du schreibst, stimmt so aus zwei Gründen eigentlich nicht:
  1. Wenn du in Delphi neue Komponenten hinzufügst, dann erscheinen die im Quellcode an einer Stelle in der Klassendefinition, bevor die Sichtbarkeit explizit angegeben wurde. Damit sind sie dann nicht "private", sondern "published" oder "public", also sichtbar und von außen verfügbar.
  2. Selbst wenn der OpenDialog1 nur "private" wäre, dann wäre er innerhalb der gleichen Unit auch von außen durchaus sichtbar, also auch hier keine Probleme für den Code von Maddin.

Das macht zwar Maddins bisheriges Vorgehen nicht unbedingt richtiger, aber funktionieren tut es bei kleinen Projekten ja erst mal schon.

Ich hoffe, dass das jetzt nicht zu klugsch***erisch rüberkam, ich wollte nur verhindern, dass Maddin noch stärker verwirrt wird, als eh schon.

Bis denn
Bommel
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Problem mit OpenDialog

  Alt 17. Jun 2010, 15:16
@ xZise
warum einen neuen Thread aufmachen, wenn der hier genau meinen Fehler anspricht??? Und gelöst war der hier auch nicht, da man immer eine zu ungenaue Fehlerbeschreibung reinsetzt.
Naja das ist ja noch besser wenn du in einem ungelösten Thread eine neue (andere) Frage aufwirst.

Zu deinem Sortieren: Du könntest das auch allgemein machen, aber dann würde ich als Parameter das zu sortierende Objekt übergeben. Dadurch kannst du das theoretisch wiederverwenden.

Also im allgemeinen würde ich halt möglichst nie auf globale Variablen zugreifen, sondern alles als Parameter oder als Attribut einer Klasse implementieren.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#9

AW: Problem mit OpenDialog

  Alt 20. Jun 2010, 20:26
Erstmal rießigen Dank für die Hilfe und sorry für die Off Topic Frage. Werde mich dann wohl mal näher mit OOP beschäftigen wenn ich Zeit habe, aber bisher brauchte ich es nicht (oder ich nutze es schon unwissentlich).

Würde sagen, Problem gelöst, lag nur an kleiner Macke zwischen Win7 64bit und Delphi.
  Mit Zitat antworten Zitat
myownshadow

Registriert seit: 23. Okt 2004
Ort: Berlin
18 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Problem mit OpenDialog

  Alt 17. Mai 2013, 20:00
Hallo !
Ich habe seit einigen Wochen nun auch dieses Problem mit dem OpenDlg. Nutze aber W7-32.
Leider funktioniert der Link auf den Workaround nicht mehr.

Bei mir erscheint, nach jedem OpenDlg Aufruf die Meldung "Das Programm funktioniert nicht mehr ..."
Ist unerklärlich, da mein Program seit langem einwandfrei funktioniert. Ich benutze Delphi mit dem RAD Studio 2010
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz