Znalazłem jednej stronie kod zródłowy, ale nie mogę go uruchomić bo występuje mi bład class tkhexeditor not found. Co może być. Dodam że program chcę uruchomić na delphi 2009.
Projekt z codem w załączniku khexeditor.zip
Hm, faktycznie istna zagadka tego wieku - co Delphi może rozumieć przez brak klasy...
Stawiam na to, że nie masz po prostu danego komponentu, ale w sumie to ciężko po tym błędzie się wskazać, dowolnie dobrze możesz mieć wirusa.
to był sarkazm
Obstawiam albo brak komponentu, albo brak odpowiedniego modułu w sekcji Uses, ale nie chce mi się ściągać załączników; Zresztą tej wersji Delphi nie mam, więc nie mam jak skompilować;
Poprzedni wątek przeniosłem do kosza, bo nie zawierał szczegółowego opisu; Widzę, że dalej nie chce Ci się sensownie opisać problemu, ewentualnie wrzucić jakiś skrawek kodu.
Zakładając, że brakuje komponentu jak się instaluje w delphi componenty to mam do wyboru tylko install packages i import component nie mam opcji install component. Dlatego mam pytanie czy trzebba insalować komponent czymusi być tylko w katalogu z programem?
Instalujesz całą paczkę z całą jej zawartością - w załączniku masz przecież pliki z rozszerzeniem .dpk (dla Delphi) oraz z rozszerzeniem .lpk (dla Lazarusa).
No tak ale jaką opcją jak nie ma instal component?
O matko, tutoriali w sieci jest kupa, a Ty tracisz czas na takie pytania...
Delphi nie używam (jednak pamiętam że schemat prawie identyczny), ale w Lazarusie wystarczy uruchomić środowisko, wybrać z menu File
opcję Open ...
, następnie wybrać z dysku plik *.lpk
(otworzy się okienko dotyczące paczki); Następnie klikasz w przycisk (w tym okienku) o treści Compile
i czekasz aż kompilacja się skończy; Ostatnim krokiem jest kliknięcie w przycisk Use >>
(także w tym okienku) i wybranie opcji Install
; Potwierdzasz zapytanie i czekasz, aż cała zawartość paczki oraz IDE zostaną skompilowane oraz czekasz, aż IDE się zrestartuje; Tyle, jeśli o instalację chodzi;
Aby użyć paczki w aplikacji, należy otworzyć dany projekt programu; Następnie otworzyć plik zainstalowanej wcześniej paczki i w tym okienku kliknąć w przycisk Use >>
oraz wybrać opcję Add to Project
; I tyle, teraz wystarczy przekompilować lub przebudować projekt i gotowe.
procedure TForm1.FormCreate(Sender: TObject);
var
przycisk: TButton;
begin
przycisk:=TButton.Create(self);
przycisk.Left:=10; // pozycja X przycisku na formularzu
przycisk.Top:=10; // pozycja Y przycisku na formularzu
przycisk.Width:=140; // szerokość przycisku
przycisk.Height:=40; // wysokość przycisku
przycisk.Caption:='Przycisk dynamiczny'; // podpis przycisku
przycisk.Parent:=self; // rodzic przycisku
przycisk.Visible:=True; // czy przycisk widoczny?
end;
Mam pytanko jak stworzyć takiego Buttona na stworzonym dynamicznie panleu?
Czyli mam utworzoną form1 i chce dynamicznie stworzyć panel i na nim button też dynamicznie?
Tworzysz panel dynamicznie, a dla tworzonego dynamicznie panelu jako właściwosć Parent
podajesz zmienną stworzonego Panelu. O to Ci chodzi chyba jeśli dobrze zrozumiałem. Żadnej filizofii tutaj nie ma. Raczej banalne i "oczywiste oczywistości"
mógł byś nappisać przykład?
Potrzebujesz przykładu użycia operatora przypisania? Wystarczająco dużo napisał Ci @olesio w swoim poście...
procedure TForm1.Button1Click(Sender: TObject);
var
pnlDynamic: TPanel;
btnDynamic: TButton;
begin
pnlDynamic := TPanel.Create(Self);
pnlDynamic.Parent := Self;
pnlDynamic.SetBounds(10, 75, 200, 100);
btnDynamic := TButton.Create(Self);
btnDynamic.Parent := pnlDynamic;
btnDynamic.SetBounds(10, 10, 100, 32);
end;
Metoda SetBounds
umożliwia od razu podanie położenia komponentu oraz jego rozmiarów, poza tym powoduje jednorazowe przemalowanie interfejsu, a nie cztery razy, jak w przypadku wpisywania nowych wartości osobno przez właściwości Left
, Top
, Width
i Height
; Kod krótszy i działa szybciej;
Poza tym pole FVisible
, na które wskazuje właściwość Visible
, domyślnie ma wartość True, więc nie trzeba jej dodatkowo definiować.
Jak zamykam okno wyskakuje mi taki błąd.
Czy muszę zwolnić tworzony przycisk?
wobec tego coś skopałeś - komunikat mówi, że próbujesz się odwołać do obiektu, który już nie istnieje
Mam taki kod jak zamykam okno i wyskakuje mi ten błąd.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
DrawGrid1: TDrawGrid;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
combo :TComboBox;
rect :TRect;
begin
combo:=ComboBox1;//.Create(self);//creates an instance of a ComboBox
rect:=DrawGrid1.CellRect(2,0);//gets the Rectangle of the cell
// sets the ComboBox location
combo.Top:=rect.Top;
combo.Left:=rect.Left;
DrawGrid1.InsertControl(combo);//insert the combo box to the grid
DrawGrid1.ColWidths[2]:=combo.Width;///actualize the width of the whole column
end;
end.
Czy musze zwolnic. Jak rozwiącać ten problem.
co chcesz zwalniać jak nic nie tworzysz?
To dlaczego po wyłaczeniu programu wystepuje bład?
a widzisz różnicę w twoim kodzie a w kodzie z przykładu http://docwiki.embarcadero.com/CodeExamples/XE8/en/InsertControl_(Delphi)
Tak to zrozumiałem musiałem wrzucic na formatkę drawgird to mi zadziałało
ale dlaczego jak chce dynamicznie stworzyć drawgir to mi nie działa
procedure TForm1.FormCreate(Sender: TObject);
var
combo :TComboBox;
rect :TRect;
drawgird: TDrawGrid;
begin
combo:=TComboBox.Create(self);
drawgird:=TDrawGrid.Create(self);
rect:=drawgird.CellRect(2,1);//<quote>Tu występuje bład </quote>
Combo.Top:=rect.Top;
Combo.Left:=rect.Left;
drawgird.InsertControl(Combo);//insert the combo box to the grid
drawgird.ColWidths[2]:=Combo.Width;///actualize the width of the whole column
end;
end.
błędów jest klika, ale podstawowy to brak przypisanego 'parenta' dla obiektów 'combo' i 'drawgrid'
a drugi to zadeklarowanie zmiennych 'combo' i 'drawgrid' jako lokalnych , tym samym po zakończeniu metody
TForm1.FormCreate
gubisz wskaźniki do utworzonych obiektów
grzegorz_so napisał(a)
[...] gubisz wskaźniki do utworzonych obiektów
Nic nie szkodzi, przecież w konstruktorach komponentów podaje jako właściciela Self, czyli formularz - on zajmie się zwolnieniem tych komponentów, jeśli samemu się tego nie zrobi;
piter2004 napisał(a)
ale dlaczego jak chce dynamicznie stworzyć drawgir to mi nie działa
rect:=drawgird.CellRect(2,1);//<quote>Tu występuje bład </quote>
Może byś tak coś więcej na ten temat napisał, a nie "nie działa"... o.O
owszem , 'owner' zwolni obiekt , ale traci się kontrolę nad obiektem z poziomu kodu , no chyba że nie jest potrzebna i obiekt żyje dalej swoim życiem
procedure TForm1.FormCreate(Sender: TObject);
var
combo :TComboBox;
rect :TRect;
drawgird: TDrawGrid;
begin
drawgird:=TDrawGrid.Create(self);
drawgird.Parent:=self;
combo:=TComboBox.Create(self);
combo.Parent:=parent;
rect:=drawgird.CellRect(2,1);//gets the Rectangle of the cell
Combo.Top:=rect.Top;
Combo.Left:=rect.Left;
drawgird.InsertControl(Combo);//insert the combo box to the grid
drawgird.ColWidths[2]:=Combo.Width;///actualize the width of the whole column
end;
Faktycznie jak przypisałem parenty to zadziałało, to był tylko przykład żebym mógł zrozumieć jak to działa.
i okazało się że jak nie przypisze parent do komponentów i użyje InsertControl(Combo) to po zamknięciu okna wyskakuje ten komunikat "Raised exceptions class..."
Jeszcze jedno pytanko chce dynamicznie stworzyć ScrollBar i obsługę zdarzeń tego komponentu dlaczego tego nie mogę skąpilować czy tak się nie robi?
Jest błąd "Scroll differs from previous declaration"
type
TWindowScroll = class(TScrollBar)
public
constructor Create(AOwner: TComponent); override;
procedure Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); override;
procedure Change(Sender: TObject); override;
private
end;
procedure TWindowScroll.Change(Sender: TObject);
begin
end;
procedure TWindowScroll.Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
Begin
End;
Jest błąd "Scroll differs from previous declaration"
Nie błąd, tylko ostrzeżenie; Pod Lazarusem metoda Scroll
jest w sekcji protected
, a Ty zadeklarowałeś ją w public
, więc próbujesz zmienić jej widoczność; To samo z metodą Change
.
Zmieniłem na protected i dalej to samo.
type
TWindowScroll = class(TScrollBar)
public
constructor Create(AOwner: TComponent); override;
protected
procedure Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); dynamic;
procedure Change(Sender: TObject); dynamic;
private
end;
Czy te procedury trzeba gdzieś przypisać do konkretnych przerwań? bo jak przesuwam scrollbar to nie wykonuje w nich kodu.
constructor TWindowScroll.Create(AOwner: TComponent);
begin
inherited;
self.OnScroll:=self.Scroll;
end;
Zrobiłem tak i dalej nie działa, nie wywołuje przy przesunięciu suwaka tej procedury
pokaż kod
type
TWindowScroll = class(TScrollBar)
public
constructor Create(AOwner: TComponent); override;
private
protected
procedure Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);Dynamic;
procedure Change(Sender: TObject); Dynamic;
end;
constructor TWindowScroll.Create(AOwner: TComponent);
begin
Inherited;
SetBounds(473, 10, 18, 500);
Kind:=sbVertical;
Align:=AlLeft;
Min:=0;
Position:=0;
Max:=Max Div EditorBuffers.WindowHEX.Cursor.MaxY;
DoubleBuffered:=true;
self.OnScroll:=self.Scroll;
self.OnChange:=self.Change;
ChangeScale(Screen.PixelsPerInch,96);
end;
procedure TWindowScroll.Change(Sender: TObject);
begin
Adres:=Position * (EditorBuffers.EditorRow+1)*16+ adres and $ff;
EditorBuffers.WindowHEX.Invalidate;
EditorBuffers.WindowTXT.Invalidate;
EditorBuffers.WindowADR.Invalidate;
end;
procedure TWindowScroll.Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
Begin
End;