ultik: Det du lige står og mangler der har har jeg faktisk selv lavet til en IRC Klient som jeg er ved at lave som et eksamensprojekt, jeg har da ikke noget imod at give dig løsningen her, og det skal lige siges at nedenstående kode har taget mig en hel dag at få det til at virke ordentligt. Nu kan jeg jo godt se at du har givet pointene til en anden, men måske kan vi finde ud af noget alligevel, da hans forslag desværre nok ikke helt er det som du i dit tilfælde har brug for.
Start med at indsætte følgende komponenter på din form:
Komponent: Navn:
Tabcontrol Tabcontrol1
Listbox LstTab
Listbox LstIndex
//De 2 listbokse bruges kun til at holde styr på de forskellige paneler
//sådan at hvis man fjerner et panel, og opretter et igen, så bruges
//de tabeller i de 2 listbokse sådan at man sørger for at genbruge
//det hukommelsesområde som det forrige panel brugte.
//derfor skal du bare sætte visible:=false til begge af dem.
Men her er koden:
//Under public declarations tilføjer du følgende:
{ Public declarations }
Richedit: Array[0..20] of TRichEdit;
Editfield: Array[0..20] of Tedit;
NickList: Array[0..20] of Tlistbox;
Totalcount: integer;
Sheet: Array[0..20] of Ttabsheet;
procedure Addtab(navn: string);
procedure Removetab(index: integer);
Function tabexists(channel: string):boolean;
Function tabindex(channel: string):integer;
//derefter tilføjer du disse procedurer og funktioner:
procedure Tform1.Addtab(navn: string);
var
I, index: integer;
begin
index:=tabcontrol1.pagecount;
for I:=0 to lstIndex.items.count-1 do begin
if lstIndex.Items.Strings[I]<>inttostr(I) then begin
index:=I;
break;
end;
end;
sheet[index] := Ttabsheet.create(self);
with sheet[index] do begin
PageControl := tabControl1;
name := 'Sheet'+inttostr(index);
Caption := navn;
end;
lsttab.Items.Insert(index,navn);
lstIndex.Items.insert(index,inttostr(index));
if (navn <> 'Status') and (navn <> 'Messages') then begin
//Istedet for at tilføje disse kontroller som jeg laver her
//Indsætter du istedet for de 8 kontroller som du vil have oprettet på panelet.
nicklist[index] := Tlistbox.Create(tabcontrol1);
with nicklist[index] do
BEGIN
Parent := sheet[index];
width := 128;
name := 'lstNick'+inttostr(index);
left := (Form1.ClientWidth - width) div 2;
top := (Form1.ClientHeight - height) div 2;
Text:='';
Multiselect:=true;
popupmenu:=nickPopup;
try
font.name:='Comic Sans MS';
except
font.name:='Arial';
end;
font.size:=10;
sorted:=true;
align:=aLRight;
END;
end;
Editfield[index] := Tedit.Create(tabcontrol1);
with editfield[index] do
BEGIN
Parent := sheet[index];
width := 128;
name := 'Edit'+inttostr(index);
left := (Form1.ClientWidth - width) div 2;
top := (Form1.ClientHeight - height) div 2;
Text:='';
//onkeypress:=EditKeypress;
font.name:='Arial';
font.size:=10;
align:=aLbottom;
END;
richedit[index] := TRichedit.Create(tabcontrol1);
with richedit[index] do
BEGIN
Parent := sheet[index];
height := 100+totalcount;
width := 128;
left := (Form1.ClientWidth - width) div 2;
top := (Form1.ClientHeight - height) div 2;
scrollbars:=ssVertical;
//Onchange:=richChange;
//OnMouseDown:=RichEditMouseUp;
lines.clear;
font.name:='Arial';
try
font.name:='Comic Sans MS';
except
font.name:='Arial';
end;
font.size:=10;
align:= ALclient;
cursor:=crarrow;
readonly:=true;
END;
end;
procedure Tform1.Removetab(index: integer);
var
I: integer;
begin
if tabcontrol1.pages[index].caption='Status' then exit;
I:=lstchan.items.indexof(tabcontrol1.pages[index].caption);
editfield[I].free;
richedit[I].free;
sheet[I].Free;
lstIndex.Items.delete(I);
lsttab.Items.delete(I);
end;
Function Tform1.tabindex(tab: string):integer;
var
I: integer;
begin
for I:=0 to lsttab.items.count-1 do begin
if lsttab.items.strings[I] = tab then
result:=I;
end;
end;
Function Tform1.tabexists(tab: string):boolean;
var
I: integer;
begin
for I:=0 to lsttab.items.count-1 do begin
if lsttab.items.strings[I] = tab then
result:=true;
end;
end;
//Da koden er taget fra min IRC Klient som jeg er ved at lave, er der sikkert lige nogle ting som du har lyst til at ændre i koden, bl.a. under AddTab proceduren skal du ændre de 3 komponenter som jeg opretter Runtime til de 8 komponenter som du vil have på hvert panel, og så huske at angive højde, bredde, left og top + parent på alle komponenterne, men de kan bruge de 3 komponenter som jeg opretter som et eksempel på hvordan du skal oprette de 8 komponenter i runtime.
Jeg håber du er lidt erfaren med Delphi, for det vil der nok kræves for at du kan få det til at virke.
PS. De 2 sidste functioner jeg har oprettet og lagt med er nogle som du kan bruge til at finde et index for en af tabsene i panelet og den sidste finder ud af om navnet på en tab allerede findes, dette kan bruges til at undgå fejl senere i din kode.
Mvh. Daniel Møller
SGUFT Software
<<E-mail>>
Firma: sguft@software.dk
privat: dj@software.dk
<<Web>>
Firma:
http://surf.to/guf