Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Form lässt sich mit show nicht öffnen (https://www.delphipraxis.net/34038-form-laesst-sich-mit-show-nicht-oeffnen.html)

MrFish 16. Nov 2004 12:39


Form lässt sich mit show nicht öffnen
 
Ich schreibe eine Anwendung bei der von der Haupt Form aus mehrere Forms mit show angezeigt werden.
Auf einmal funktioniert das mit mit einer Form nicht mehr. Es kommt keine Fehlermeldung, sondern es passiert garnichts. Ich kann mir nicht erklären warum, da mir nicht bewusst ist etwas in dem Bereich geändert zu haben.
Ich habe die Eigenschaften verglichen, ich habe die Form aus dem Projekt entfernt, und neu eingefügt, ich habe die Uses Klausel geprüft. Alle ohne Befund. Woran kann es noch liegen? :gruebel:

Gruß MrFish

Luckie 16. Nov 2004 12:41

Re: Form lässt sich mit show nicht öffnen
 
Sthet die Visible-Eigenschaft der Form eventuell auf False?

alcaeus 16. Nov 2004 12:43

Re: Form lässt sich mit show nicht öffnen
 
Zitat:

Zitat von Luckie
Sthet die Visible-Eigenschaft der Form eventuell auf False?

:shock: Ich darf Luckie korrigieren... In der OH steht dass Show die Visible-Eigenschaft auf True setzt.

@MrFish: Wird das OnShow-Ereignis denn ausgeführt? Werden die Koordinaten des Form (Left und Top) auf Werte gesetzt, die außerhalb des sichtbaren Bereiches stehn?

Greetz
alcaeus

MrFish 16. Nov 2004 13:00

Re: Form lässt sich mit show nicht öffnen
 
Zitat:

Werden die Koordinaten des Form (Left und Top) auf Werte gesetzt, die außerhalb des sichtbaren Bereiches stehn?
Nein, hab ich auch schon geprüft, ausserdem steht WindowsState auf WsMaximized.

Dani 16. Nov 2004 13:09

Re: Form lässt sich mit show nicht öffnen
 
Hi!

Passiert es immer mit der gleichen Form? Wird im OnShow dieser Form evtl. igendwelcher Code ausgeführt, der die Form wieder unsichtbar macht?

ReDoX 16. Nov 2004 13:11

Re: Form lässt sich mit show nicht öffnen
 
Kannst du etwas Code posten wie du die Form öffnest und was im OnShow steht?
Mfg MrScholz

MrFish 16. Nov 2004 13:21

Re: Form lässt sich mit show nicht öffnen
 
Das ist der komplette Code der fraglichen Form:
Code:
unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TVorlage = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button9Click(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Vorlage: TVorlage;

implementation

{$R *.dfm}

procedure TVorlage.FormCreate(Sender: TObject);
var
  Default: TStringList;
  i     : Integer;
  j     : Integer;
  pos   : Integer;
begin

//----------------------------------------------------------------------------
//----------- Saltenköpf schreiben -------------------------------------------
//----------------------------------------------------------------------------

 StringGrid1.Cells [0,0] := 'von';
 StringGrid1.Cells [1,0] := 'bis';
 StringGrid1.Cells [2,0] := 'von';
 StringGrid1.Cells [3,0] := 'bis';
 StringGrid1.Cells [4,0] := 'von';
 StringGrid1.Cells [5,0] := 'bis';
 StringGrid1.Cells [6,0] := 'von';
 StringGrid1.Cells [7,0] := 'bis';
 StringGrid1.Cells [8,0] := 'von';
 StringGrid1.Cells [9,0] := 'bis';
 StringGrid1.Cells [10,0] := 'von';
 StringGrid1.Cells [11,0] := 'bis';

//----------------------------------------------------------------------------
//-------- Vorlagen laden ---------------------------------------------------
//---------------------------------------------------------------------------

Default := TStringList.create;
Default.LoadFromFile('c:/delphi/default.txt');

Pos := 0;
For j := 1 to 20 do
begin
  For i := 0 to 11 do
  begin
    StringGrid1.Cells[i,j] := default[pos];
    Pos := Pos + 1;
  end;
end;
Default.Destroy;
end;

procedure TVorlage.Button8Click(Sender: TObject);
var
  i : integer;
  j : integer;
  Default : TStringlist;
begin
  Default := TStringlist.Create;

//---------------------------------------------------------------------------
//-------- Vorlage abspeichern ----------------------------------------------
//---------------------------------------------------------------------------

  For j := 1 to 20 do
    begin
      for i := 0 to 11 do
      default.Add(StringGrid1.Cells[i,j]);
    end;
    Default.SaveToFile('C:/delphi/default.txt');
    Default.Destroy;
    Vorlage.Hide;
end;

procedure TVorlage.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
//--------------------------------------------------------------------------
//-------Tabelle nach Wochentagen unterteilen ------------------------------
//--------------------------------------------------------------------------

 begin
if Acol = 2 then
   begin
   StringGrid1.Canvas.Pen.Color:=clblack;
   StringGrid1.Canvas.Pen.Width:=1;
   StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
   StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
   end;

if Acol = 4 then
   begin
   StringGrid1.Canvas.Pen.Color:=clblack;
   StringGrid1.Canvas.Pen.Width:=1;
   StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
   StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
   end;

if Acol = 6 then
   begin
   StringGrid1.Canvas.Pen.Color:=clblack;
   StringGrid1.Canvas.Pen.Width:=1;
   StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
   StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
   end;

if Acol = 8 then
   begin
   StringGrid1.Canvas.Pen.Color:=clblack;
   StringGrid1.Canvas.Pen.Width:=1;
   StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
   StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
   end;

if Acol = 10 then
   begin
   StringGrid1.Canvas.Pen.Color:=clblack;
   StringGrid1.Canvas.Pen.Width:=1;
   StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
   StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
   end;

if Acol = 12 then
   begin
   StringGrid1.Canvas.Pen.Color:=clblack;
   StringGrid1.Canvas.Pen.Width:=1;
   StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
   StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
   end;

end;

end;

procedure TVorlage.Button9Click(Sender: TObject);
begin
  Vorlage.Hide;
end;

procedure TVorlage.StringGrid1Click(Sender: TObject);
begin

end;

end.
und hier der Aufruf:

procedure TWochenplan.VorlageClick(Sender: TObject);
begin
Vorlage.show;
end;

Dummy 16. Nov 2004 13:40

Re: Form lässt sich mit show nicht öffnen
 
Hallo MrFish,

ich würde zuerst mal das Default.Destroy gegen Default.Free ersetzen.
Tritt das Problem bei Button9 wie auch bei Button8 auf?
Manchmal kann es hilfreich sein wenn man Windows etwas Zeit gönnt Nachrichten zu verarbeiten. Bei dem Hide von Button8 würde ich versuchsweise vor dem Hide mal ein "Application.ProcessMessages" einfügen. Glaube zwar nicht daran das das der Fehler ist, aber es sieht so aus als würden Windows ein paar Messages nicht verarbeiten können.

Hoffe es hilft
Dummy

shmia 16. Nov 2004 14:02

Re: Form lässt sich mit show nicht öffnen
 
folgender Programmcode zeigt einen häufigen Anfängerfehler:
Delphi-Quellcode:
procedure TVorlage.Button9Click(Sender: TObject);
begin
  Vorlage.Hide; // FALSCH !!!!!
//^^^^^^^ 
end;
Wenn du ein Formularklasse (hier: TVorlage) hast, darfst du nicht innerhalb der Klasse auf ein bestimmtes
Objekt dieser Klasse zugreifen (hier: var Vorlage:TVorlage)!!!
Stattdessen musst du den versteckten Parameter Self verwenden:
Delphi-Quellcode:
procedure TVorlage.Button9Click(Sender: TObject);
begin
  self.Hide; // richtig
  // man kann self auch ganz weglassen
  Hide;
end;
Grund:
Wenn jemand ein Formular der Klasse TVorlage erzeugt, muss er dieses Formular ja nicht zwingend in der Variablen
Vorlage speichern.
Dadurch können sehr seltsame Fehler und Zugriffsverletzungen auftreten.
Diese Grundregel gilt für alle Klassen, nicht nur für Formulare. Die Regel gilt auch für alle objektorientierten
Programmiersprachen (nicht nur für Delphi).

Sharky 16. Nov 2004 14:10

Re: Form lässt sich mit show nicht öffnen
 
Hai MrFish,

mal ganz am Rande. Warum hast Du denn so viele IF-Abfragen in deinem OnDrawCell? Es wird doch immer das selbe gemacht.
So müsste es doch auch gehen.

Code:
unit Unit8;
.
.
procedure TVorlage.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
//--------------------------------------------------------------------------
//-------Tabelle nach Wochentagen unterteilen ------------------------------
//--------------------------------------------------------------------------
  if (Acol IN [2,4,6,8,10,12]) then
    begin
      StringGrid1.Canvas.Pen.Color:=clblack;
      StringGrid1.Canvas.Pen.Width:=1;
      StringGrid1.Canvas.moveto(Rect.Left,Rect.Top);
      StringGrid1.Canvas.Lineto(Rect.Left,Rect.Bottom);
    end;
end;
.
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Seite 1 von 2  1 2      

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