Autor Beitrag
Dennys
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 11.01.12 16:16 
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
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
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
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
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: <span class="inlineSyntax"><span class="codecomment">{PROTECTTAGb0cc5c3a7551b3f09f35a4853d220b92}</span></span>
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)
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
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
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)
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
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:
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
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
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!
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:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), 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
1:
2:
for i := PageControl.PageCount - 1 downto 0 do
  PageControlX.Pages[i].Free;
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?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), 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...
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:
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
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
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!