[delphi] jak skopiowac panel

0

witam, dopiero stawiam pierwsze kroki w programowaniu takze sory:)

mam utworzony panel z kilkunastoma imputami, buttonami itp. - jest to swego rodzaju maszynka liczaca:)
chce aby za pomoca innego buttona zostal skopiowany caly panel w miejsce kilka jednostek ponizej oryginalnego.
jakim poleceniem to zrobic? jak nadac wszystkim polom charakterystyczne inne nazwy? moze byc to za pomoca petli gdzie do nazwy bedzie dodawana kolejna cyfra.
dzieki z gory

0

Chyba najlepiej utworzyc wlasny komponent (wraz z pozadana funkcjonalnoscia) i tworzyc dynamicznie te komponenty na oknie.

0

co masz na mysli piszac o utworzeniu wlasnego komponentu?

0

To ma na myśli stworzenie od podstaw komponentu. Nie da się jaśniej chyba. W tym przypadku będzie
to TPanel, na którym pop[rzez kod musisz umieścić dynamicznie tworzone buttony i inne komponety, a
także poprzez kod dodać do nich obsługe potrzebnych zdarzeń jak na przykład OnClick. Można też o ile
Ci taki rozwiązanie pasuje stworzyć osobną formatkę i ją dynamicznie tworzyć wiele razy, ale ty pewnie
chcesz mieć ten panel wiele razy w jednym okienku to tak zrób, jak pisałem. I w konstruktorze Twojego
komponentu twórz odpowiednie obiekty na tym panelu. Poniżej masz dość prosty przykład takiego kodu

unit panelik;

interface

uses
  Windows, Forms, Classes, StdCtrls, ExtCtrls;

type
  TMojPanel = class(TPanel)
  private
    procedure BtnClick(Sender : TObject);
  published
    constructor Create(AOwner : TComponent); override;
  end;

implementation

constructor TMojPanel.Create(AOwner : TComponent);
var
  Btn : TButton;
begin
  inherited Create(AOwner);
  Left := 8;
  Top := 10;
  Height := 200;
  Width := 400;
  Btn := TButton.Create(Self);
  with Btn do
  begin
    Parent := Self;
    Left := 8;
    Top := 10;
    Height := 26;
    Width := 100;
    Name := 'Przycisk1';
    Caption := 'Kliknij mnie';
    OnClick := BtnClick;
  end;
end;

procedure  TMojPanel.BtnClick(Sender : TObject);
begin
  MessageBox(Application.Handle, 'Kliknąłeś w przycisk!',
  PChar(Application.Title), MB_ICONINFORMATION + MB_OK);
end;

end.

Później dodajesz w module głownym do sekcji uses moduł panelik i tworzysz takim na przykład kodem:

var
  A : TMojPanel;
begin
  A := TMojPanel.Create(Self);
  A.Parent := Self;
  A.Name := 'Panel1';
  A.Caption := '';
end;

Jak widzisz banalne. Mam nadzieję, że wszystko jasne :)

0

Poczatkujacemu kazac stworzyc wlasny komponent jak on nie wie co to unit Math np.
Moim zdaniem nalezy przepisac wszystkie komponenty (stworzyc je dynamicznie) i do nazwy dodawac cyfre. Tyle.

0

Poczatkujacemu kazac stworzyc wlasny komponent jak on nie wie co to unit Math np.
Moim zdaniem nalezy przepisac wszystkie komponenty (stworzyc je dynamicznie) i do nazwy dodawac cyfre. Tyle.

no wlasnie tak jak napisal adydan chyba bedzie lepiej i wiecej zrozumiem jak ktos mnie naprowadzi bo to co napisal olesio na poczatek jednak troche mnie przerasta:(

0

No mój kod właśnie robi to co sugeruje adydan, a przynajmniej tak mi się wydaje tylko zamiast tworzenia też
dynamicznie komponentów w tym samym module co reszta kodu programu, dla zachowania porządku, a tskże
przejrzystości odbywa się to w osobnym module (pliku). Myślałem że jak pytający zobaczy gotowy kod - to go
on na coś naprowadzi, ale może się myliłem. To w takim razie skoro zico wolisz sposób zbliżony jaki sugeruje,
według mnie, adydan - to jego proś o przykłady, bo rozumiem że mimo tych postów dalej nie wiesz co i jak,
to może ten ekst coś Ci podpowie http://pl.wikibooks.org/wiki/Delphi/Dynamiczne_tworzenie_komponentów

0

Poczytaj sobie to co jest w poście w linku wyżej i szczególną uwagę zwróć na:

    procedure TForm1.FormCreate(Sender: TObject);
    var

        i,n: Integer; 

    begin

        n:=10; // liczbę dynamicznych komponentow
        for i:=1 to n do

            with TButton.Create(self) do begin     //tworzymy guzik (TEdit-okienko do wpisywania, TMemo- komponent memo itd)

                Width:=140;            //szerokosc (dlugosc)
                Height:=40;             //wysokosc
                Left:=10;                //odstep od lewej
                Top:=10+i*(Height+10);   //odstep od gory
                Caption:='Przycisk '+IntToStr(i); // IntToStr zamienia liczbę typu Integer na jej postać tekstową, 
//typu string (nazwa+numerek kolejny ktory jest nazwa)
//czyli przycisk 1; przycisk 2; itd
                Parent:=self;              //ustawienie rodzica ->forma (czyli to co tworzysz znajduje sie na formie)
                Visible:=True;            //element widoczny
                end;

    end; 

Jak będziesz już umiał tworzyć dowolne komponenty poprzez program i je np wypełniać wówczas sie odezwij ponownie.
Widze że nie tylko ja tu siedzę po nocach.

0

dzieki wielkie, o cos takiego mi chodzilo.

Jak będziesz już umiał tworzyć dowolne komponenty poprzez program i je np wypełniać wówczas sie odezwij ponownie.

podejrzewam ze dam rade powstawiac w tym miejscu jakies komponenty - bo cos tam juz X lat temu jednak probowalem ugryzc tego programowania:)
problemem moze byc jednak duplikowanie tego panelu, tak aby nie podawac za kazdym razem jego wymiarow i tego co ma sie na nim znajdowac (innych komponentow typu edity, buttony itp. - czyli to co poprzez program utworze na panelu 1), a jedynie okreslac jego polozenie na formie

Widze że nie tylko ja tu siedzę po nocach.

no wlasnie ja za jakis czas ide sie troche zdrzemnac takze jutro na pewno powroce do tematu:)
dzieki za pomoc

0

Jeżeli chcesz jak najmniej kodu powtarzać ustawiając zawartość Panelu, który ma być tworzony wielokrotnie to
ja bym jednak polecał utworzyć go w taki sposób jak pokazałem wcześniej. W konstuktorze czyli tak w linijce
kodu od constructor TMojPanel.Create(AOwner : TComponent); możesz ustawić wymiary Panelu oraz całą jego
zawartość. Wtedy w kodzie głownego modułu Twojego programu, który ma pokazywać wiele tych panelów, na
formatce - ustawiasz jedynie Left oraz Top Panelu. A co do siedzenia po nocach, to ja mam czas to siedze no i
przy okazji testuje jeden swój program teraz, a trwa to troche bo należy wpisać w pola edycyjne wyniki gier w
Sensible Soccer Online z ostatniego Pucharu Polski. Później program ma być też użyty na turnieju offline, więc
chce wiedzieć czy wszystko działać będzie jak należy. A później odsypiam w dzień co trace nie spiąc w nocy :)

0

olesio chcesz bota ktory to zrobi za Ciebie ? Mozna cos takiego klepnac jak klepnąłem bota ktory obsluguje ogame to inne tez sie da :)

Zico mozesz wrzucic cos w stylu tego co napisalem tylko z parametrem zmiennej, ktora bedzie np zmienna typu byte. nazwa elementu +IntToStr(nasz byte) :) Wowczas po stworzeniu funkcji bedziesz tylko wywolywal np panelx(10, polozenie_top, polozenie_left);
i funkcja ktora bedzie tworzyla panel numer 10 z elementami kolejno numer 10 w podanym polozeniu nie trzeba sie zbytnio napracowac bo pozostale elementy ustawiasz na panelu i wraz z nim wedruja w okreslone miejsca. To co Ci podałem wczesniej daje 10 przyciskow jak pamietam, zamien n:=10 na n:=100 i bedziesz mial ich 100, a kod dluzszy nie bedzie po to sa petle oraz funkcje czy procedury.

0

Bot do SWOSa? Istnieje coś takiego ale autor uparcie nie chce upublicznic kodu, a exe z Polaków maja chyba
tylko z trzy osoby najdluzej dzialajace w społeczności SWOSa w naszym kraju, a podejrzewam że osobnik - z
Niemiec w tym przypadku - pisal to właśnie w Delphi, ale moge się mylić. Współpracuje to z botem ircowym i
na kanale na bieżąco komentuje mecz w jakiś sposób przechwytując dane z emulatora WinUAE Kaillera do gier
online. Jest to tak sprytnie zrobione że potrafi wychwycic kiedy są rożne zdarzenia na boisku. Natomiast to co
ja napisałem jest mniej zaawansowane, bo działa offline i ma posłużyc do wprowadzania wyników, przez żywą
osobę którą w tym przypadku prawdopodobnie będę ja. Ale dość o tym, bo zrobiłem w tym temacie offtopic :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1