Autor Beitrag
AndreM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Do 22.01.04 20:34 
Hallo Community,

ich brauche mal wieder einen kleinen Denkanstoß.

Und zwar lade ich in meinem Programm Frames zur Laufzeit, da es einfach zu viele währen, um diese alle per Visible:=TRUE; sichtbar zu machen.

Bisher habe ich das ganze folgendermaßen gelöhst.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm_Haupt.MenueItemClick(Sender: TObject; Item: String);
begin
  FFrame.Free;  // Alten Frame löschen
  FFrame:=NIL;
 
  if item = 'Benutzerverwaltung' then
  begin
    FFrame:=TFrame_Benutzerverwaltung.Create(Self);
    FFrame.Left:= 112;
  end;

  if item = 'Kunden' then
  begin
    FFrame:=TFrame_Kunden.Create(Self);
    FFrame.Left:= 112;
  end;
  if Assigned(FFrame) then FFrame.Parent:=Self;
end;

Das ganze funktioniert auch ganz wunderbar. Da das Auswahlmenü jedoch ein paar mehr Einträge als nur die zwei erhält und ich nicht für jede Auswahl ne Extra If-Abfrage machen wollte habe ich das ganze mal in zwei Proceduren unterteilt.

Jetzt sieht das ganze so aus.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm_Haupt.MenueItemClick(Sender: TObject; Item: String);
begin
  FFrame.Free;  // Alten Frame löschen
  FFrame:=NIL;

  anwendung:= item;
  get_permissons;

  FFrame:= framename;
  FFrame.Left:= 112;

  if Assigned(FFrame) then FFrame.Parent:=Self;
end;

anwendung ist vom Typ String und speichert den jeweiligen Ausgewählten Menüpunkt in einer globalen Variable zwischen.

Die Procedure get_permission ließt aus einer IB-Datenbank dem jeweiligen Framename und die Gruppen die Zugriff auf die Anwednung haben aus und speichert diese dann ebenfalls in Globalen Variablen zwischen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure get_permissons;
begin
  Form_Haupt.IBQuery_Einlesen.SQL.Clear;
  Form_Haupt.IBQuery_Einlesen.SQL.Add('select FRAME_99, SCHREIBEN_99, LESEN_99 from ANWENDUNGEN_99 where NAME_99 ="' + anwendung + '"');
  Form_Haupt.IBQuery_Einlesen.Open;

  framename  := Form_Haupt.IBQuery_Einlesen.FieldByName('FRAME_99').AsString + '.Create(Self)';
  schreiben  := strtoint(Form_Haupt.IBQuery_Einlesen.FieldByName('SCHREIBEN_99').AsString);
  lesem      := strtoint(Form_Haupt.IBQuery_Einlesen.FieldByName('LESEN_99').AsString);
end;


Das Problem an der ganze Sache ist jetzt jedoch das framename von Typ String ist und ich aber bei FFrame:= framename; eine Variable von Typ TFrame benötige. Wenn ich jetzt framename von Typ TFrame deklariere kann ich logischerweise die beiden Strings nicht mehr aneinander kopieren.

Ich hoffe mal ihr versteht einigermaßen was ich meine und habe eventuell ne Lösung für mich wie ich das ganze auf meine Weise lösen kann oder ihr habt vielleicht eine bessere Lösung für mich?

Und da ich nicht wegen jedem Prob nen neues Thema aufmachen will hab ich noch eine Frage zum Thema Tabellennamen in einer IB-Datenbank. Und zwar wollte ich meine Tabellen folgendermaßen benennen 99_ANWENDUNG. Mit der IBConsole kann ich eine solche Tabelle auch ohne weiteres erzeugen. Jedoch kann ich dann von Delphi aus nicht auf diese Tabellen zugreifen das Delphi anscheinet keine Tabellen oder Felder haben will die mit einer Ziffer beginnen. Ist das so korrekt, oder war ich nur zu blöd? :D
Chatfix
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1583
Erhaltene Danke: 10

Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
BeitragVerfasst: Do 22.01.04 22:29 
AndreM hat folgendes geschrieben:

Und da ich nicht wegen jedem Prob nen neues Thema aufmachen will

solltest du aber...



Zu deinem ersten Problem, müsste es nicht heissen:

ausblenden Delphi-Quelltext
1:
FFrame.Name := framename;					


vllt hab ichs auch falsch verstanden gg

_________________
Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
AndreM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Fr 23.01.04 08:11 
Chatfix hat folgendes geschrieben:
AndreM hat folgendes geschrieben:

Und da ich nicht wegen jedem Prob nen neues Thema aufmachen will

solltest du aber...

Ok, werd ich beim nächsten mal dran denken.


Chatfix hat folgendes geschrieben:
AndreM hat folgendes geschrieben:

Zu deinem ersten Problem, müsste es nicht heissen:

ausblenden Delphi-Quelltext
1:
FFrame.Name := framename;					


vllt hab ichs auch falsch verstanden gg


Hm, falsch verstanden hast du das glaub ich nicht. Jedoch funktioniert das nicht so 100%tig.
Ich habe das ganze jetzt erstmal so probiert (Framenamen hab ich mal fest eingebrannt).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  FFrame.Free;  // Alten Frame löschen
  FFrame:=NIL;

  anwendung:= item;
  get_permissons;

  FFrame.Name:= 'Frame_Benutzerverwaltung';
  FFrame.Create(Self);
  FFrame.Left:= 112;

Wenn ich jetzt jedoch einen Menüpunkt aufrufe bekomme ich sofort ne Allgemeine Schutzverletzung bei Adresse XXX.
Die Schutzverletzung tritt bei jeder Zeile auf in der FFrame etwas zugewiesen wird.
Also wenn ich z.B. FFrame.Name:= 'Frame_Benutzerverwaltung'; auskommentiere, dann tritt die Schutzverletzung bei der nächsten Zeile auf. Andernfalls sofort bei FFrame.Name:= 'Frame_Benutzerverwaltung';.
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Fr 23.01.04 09:31 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
FFrame.Free;  // Alten Frame löschen 
FFrame:=NIL

anwendung:= item; 
get_permissons; 

FFrame.Name:= 'Frame_Benutzerverwaltung'
FFrame.Create(Self); 
FFrame.Left:= 112;


Sorry, aber das der obige Code Zugriffsverletzungen erzeugt ist kein Wunder.

1. Erst löscht Du den Frame, besser wäre FreeAndNil(FFrame), dann weist Du einem NIL - Pointer Werte zu.

2. Welcher Typ soll FFrame sein? FFrame.Create(Self) macht so für mich keinen Sinn, da entweder FFrame vom Type class of TFrame ist und díe tatsächliche erstellte Instance wird ignoriert oder Du macht NIL.Create(Self), was so auch nicht gehen kann.

Gruß
KidPaddle
AndreM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Fr 23.01.04 10:39 
Hallo KidPaddle,

zunächst einmal danke für deine Antwort.

Also ursprüunglich sa die Zeile die den Frame geladen hat ja so aus.
FFrame ist vom Typ TFrame.
FFrame:=TFrame_Benutzerverwaltung.Create(Self);

Mit dieser Zeile hat alles ganz wunderbar funktionier. Da ich ja jetzt, wie oben beschrieben, nicht für jeden Menüounkt ne extra If-Abfrage erstellen wollte hab ich mir oben gepostete Funktion geschrieben die Anhand des ausgewählten Menüpunkt den Framename aus einer DB ausließt.
Der Frame heitß in diesem Fall 'Frame_Benutzerverwaltung'.

Hoffe das mal das das das war, was du meintest! :) Ich bin in diesem Gebiet noch ein kleiner Newbie! :D