Błąd kompilacji - nie można odnaleźć klasy TKHexEditor

0

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

0

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

0

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.

0

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?

0

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).

0

No tak ale jaką opcją jak nie ma instal component?

0

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.

0
  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?

1

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"

0

mógł byś nappisać przykład?

1

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ć.

0

Jak zamykam okno wyskakuje mi taki błąd.

f3fc339954.png

Czy muszę zwolnić tworzony przycisk?

0

wobec tego coś skopałeś - komunikat mówi, że próbujesz się odwołać do obiektu, który już nie istnieje

0

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.

1

co chcesz zwalniać jak nic nie tworzysz?

0

To dlaczego po wyłaczeniu programu wystepuje bład?

1

a widzisz różnicę w twoim kodzie a w kodzie z przykładu http://docwiki.embarcadero.com/CodeExamples/XE8/en/InsertControl_(Delphi)

0

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. 
1

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

0
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

0

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

0
 
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;

0

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.

0

Zmieniłem na protected i dalej to samo.

0
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;
0

Czy te procedury trzeba gdzieś przypisać do konkretnych przerwań? bo jak przesuwam scrollbar to nie wykonuje w nich kodu.

0
constructor TWindowScroll.Create(AOwner: TComponent);
begin
  inherited;
  self.OnScroll:=self.Scroll;
end;
0

Zrobiłem tak i dalej nie działa, nie wywołuje przy przesunięciu suwaka tej procedury

0

pokaż kod

0
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; 

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