[Pagecontrol, VCL Win32] Dynamische Anzahl von Sheets wieder freigeben
spacer
Autor Nachricht
Dennys
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 16:16 
Komponente: Pagecontrol
Verwendete VCL: VCL Win32
Hallo zusammen,
ich bin neu hier und bin mir sicher, ihr habt schon oft das Thema besprochen.
Ich hab auch schon etliches gelesen und ausprobiert, komme aber einfach nicht weiter. Daher meine Bitte an euch mir zu helfen.
Ich möchte auf einem pageControl eine dynamische Anzahl sheets erstellen. Auf jedes Sheet kommt eine Tabelle die mit einer SQL Abfrage verbunden ist.
ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
var 
i,anzahl_tabs : integer;
kostenstelle : string;
mypagecontrol : TspSkinpagecontrol;
newSheet:TTabSheet;
newGrid : TspSkinDBGrid;
begin
with q_kostenstellen do
begin
close;
sql.Clear;
sql.Add('select * from Kostenstellen where Kostenstelle <> :kst and IS_WEK = 1 order by Kostenstelle');
Parameters.ParamByName('kst').Value := '';
open;
anzahl_tabs := RecordCount;
kostenstelle := FieldByName('Kostenstelle').AsString;
end;
try
mypagecontrol:=TspSkinpagecontrol.Create(SDIAppForm);
mypagecontrol.Parent := SDIAppForm;
mypagecontrol.Name := 'pc_kostenstellen';
mypagecontrol.Align := alClient;

for i := 1 to anzahl_tabs do
begin
with mypagecontrol do
begin
NewSheet:=TTabSheet.Create(mypagecontrol);
newSheet.PageControl:=mypagecontrol;
newSheet.Caption:= q_kostenstellen.FieldByName('Kostenstelle').AsString + ';' + q_kostenstellen.FieldByName('Bezeichnung').AsString;
newSheet.Name := 'Sheet' + q_kostenstellen.FieldByName('Kostenstelle').AsString;
newSheet.parent := mypagecontrol;

newGrid:= TspSkinDBGrid.Create(mypagecontrol);
newGrid.parent := newsheet;
newgrid.align := alClient;
newgrid.ReadOnly := True;
newgrid.Name := 'Grid' + q_kostenstellen.FieldByName('Kostenstelle').AsString;

newgrid.DataSource := ds_Bestelldetail;
newGrid.Columns.Add;
newGrid.Columns[0].FieldName := 'Bereich';
newGrid.Columns[0].Width:= 80;
newGrid.Columns.Add;
newGrid.Columns[1].FieldName := 'Artikelname';
newGrid.Columns[1].Width:= 200;
newGrid.Columns.Add;
newGrid.Columns[2].FieldName := 'Artikelnummer';
newGrid.Columns[2].Width:= 100;
newGrid.Columns.Add;
newGrid.Columns[3].FieldName := 'err_hersteller';
newGrid.Columns[3].Width:= 300;
newGrid.Columns[3].Title.caption := 'Hersteller';
newGrid.Columns.Add;
newGrid.Columns[4].FieldName := 'Auftragsnummer';
newGrid.Columns[4].Width:= 120;
newGrid.Columns.Add;
newGrid.Columns[5].FieldName := 'Bestell_Datum';
newGrid.Columns[5].Width:= 120;
newGrid.Columns[5].Title.caption := 'Bestellung vom';

end;
q_kostenstellen.FindNext;
end;
finally
end;

end;


Soweit funktioniert das ja ganz vernünftig.
Allerdings und da komm ich nicht weiter, soll beim FormClose alles wieder freigegeben werden

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TSDIAppForm.loesche_komponenten;
var
i :integer;
begin
while mypagecontrol.ComponentCount > 0 do
begin
mypagecontrol.Components[0].free;
end;
Application.ProcessMessages;
end;

Wenn ich mich auf den sheets aber bewege, also activapageindex <> 0 ist, bekomme ich eine Fehlermeldung und kann es mir einfach nicht erklären
Ich hoffe Ihr könnt mir helfen
Gruß aus Münster
Dennys

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 929
Erhaltene Danke: 70


Delphi 2010 Enterprise
BeitragVerfasst: Mi 11.01.12 16:36 
Hallo und Willkommen in der Entwicklerecke. :welcome:

Du solltest Deinen Code in Delphi-Tags packen, dann wird das auch im Forum lesbar: [delphi][/delphi]
Du musst das beim Schließen eigentlich gar nicht freigeben, denn beim Erstellen hast Du ja den Owner angegeben. Dadurch wird es automatisch freigegeben, wenn der Owner freigegeben wird.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dennys Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 16:45 
Hallo Jens
danke für die schnelle Antwort. Und sorry das ich die Formatierung nicht gemacht hab. Ich stehen aber noch unter Welpenschutz :oops:
Aber wenn ich keine Freigabe mache bekomme ich auch eine Zugriffsverletzung und dem Hinweis einer ungültigen Zeigeroperation.
Ich weiss aber nicht wo der Fehler liegen kann...
Gruß
Dennys
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 929
Erhaltene Danke: 70


Delphi 2010 Enterprise
BeitragVerfasst: Mi 11.01.12 16:49 
Dann zeig mal etwas mehr Code und den genauen Wortlaut der Fehlermeldung und an welcher Stelle sie auftritt.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dennys Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 17:00 
mehr code gibt es nicht.
Ich hab es extra in ein Testprojekt gepackt weil ich erst dachte ich hätte woanders noch einen Zeiger gesetzt und der Fehler gar nicht mit dieser Routine zusammenhängt...
Auftreten tut der Fehler hier:
ausblenden Delphi-Quelltext markieren
1:
2:
 while mypagecontrol.ComponentCount > 0 do 
begin mypagecontrol.Components[0].free;


Fehlermeldung:
Exeption EAccessViolation in Modul... bei 0004653A
Zugriffsverletzung bei Adresse 0044653A in Modul...
Lesen von Adresse 00000020

p.s. ich hoffe ich hab den Code jetzt richtig formatiert... :gruebel:
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 630
Erhaltene Danke: 11


D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 11.01.12 17:52 
PageControl.PageCount gibt dir die Anzahl der Tabsheets in der Pagecontrol ;)

ich würds so machen:
ausblenden Delphi-Quelltext markieren
1:
2:
for i := 0 to PageControl.PageCount -1 do
PageControl.Pages[i].Free;

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dennys Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 18:01 
So hab ich es auch schon probiert --> gleicher Fehler
Was ich so komisch finde ist die Tatsache, dass es funktioniert wenn ich nicht auf einen anderen Reiter geklickt habe.
Wechsel ich aber auf einen Reiter und beende dann (rufe also dann die Procedure auf) kommt der Fehler.
Hab auch schon versucht das pagecontrol auf den ersten Reiter zu setzen bevor ich die free Procedure aufrufe aber bringt keine Besserung....
Das kann doch nicht so schwer sein???? :gruebel:
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mi 11.01.12 18:26 
user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
ich würds so machen:
Ich nicht. Aus einem Array Elemente löschen (ja, das passiert, wenn man ein TabSheet freigibt, implizit) bewirkt eine Indexverschiebung. Deshalb geht das nur rückwärts mit downto in der for-Schleife. Sprich:
ausblenden Delphi-Quelltext markieren
1:
2:
for i := PageControl.PageCount - 1 downto 0 do
PageControlX.Pages[i].Free;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dennys Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 18:34 
gleicher Fehler...
würde es Sinn machen wenn das array von hinten gelöscht wird nicht auf die erste Seite sondern auf die letzte Seite zu gehen bevor man es frei gibt?

Moderiert von user profile iconNarses: Beiträge zusammengefasst

war das PageControlX. ein Tippfehler?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mi 11.01.12 19:02 
user profile iconDennys hat folgendes geschrieben Zum zitierten Posting springen:
war das PageControlX. ein Tippfehler?
Ich schreibe meistens einfach nen X hin, damit da keine 1 dahinter steht, das hat nix zu sagen.

Hier funktioniert das mit Delphi XE jedenfalls problemlos so. Welche Delphiversion hast du denn?

Ich vermute aber, dass der Fehler bei einer der verwendeten Komponenten liegt. Wenn ich da schon sowas wie Skins lese...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dennys Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 19:25 
Hi zuma
das ist ja krass
du hast Recht...
es sind die verwendeten Komponenten....und ich eier seit drei Tagen mit dem Sch... rum

Vielen Dank euch allen!
Gruß
Dennys

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Leute
ich bin so blöd... :oops:
manchmal sieht man den Wald nicht...
dank des Hinweises von Zuma klappt es dann auch mit meinen externen Komponenten...
ttabsheet ist doch abgeleitet vom pagecontrol
und wenn das eine Komponente ist, ich aber das sheet von der Standardkomponente deklariere kann das ja nicht funktionieren.....
Liegt also nicht an der Komponente sondern an meine Dummheit :-(

Danke noch einmal an euch dreien!!!
:beer:
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 630
Erhaltene Danke: 11


D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Do 12.01.12 08:47 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
ich würds so machen:
Ich nicht. Aus einem Array Elemente löschen (ja, das passiert, wenn man ein TabSheet freigibt, implizit) bewirkt eine Indexverschiebung. Deshalb geht das nur rückwärts mit downto in der for-Schleife. Sprich:
ausblenden Delphi-Quelltext markieren
1:
2:
for i := PageControl.PageCount - 1 downto 0 do
PageControlX.Pages[i].Free;


Hast natürlich Recht, ich mal wieder noch schnell vor Feierabend einfach mal was getippt ;)

Zuma

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home