Ale co? To potwierdza moje słowa. Można kupić D7 i ściągnąć jak jesteś zarejestrowany jako user j tyle. Nie będę przekonywał do suchych faktów. https://www.embarcadero.com/products/delphi/previous-versions
- Rejestracja:około 4 lata
- Ostatnio:prawie 4 lata
- Postów:204

- Rejestracja:ponad 19 lat
- Ostatnio:około 3 lata
- Lokalizacja:Świecie
Czy mogę zmienić pliki w lazarusie? Customlistbox.inc czy to zgodne z licencją. LCLType StdCtrls i inne pliki pp? Bo będzie śmigał komponent :-) Bo namieszali w plikach. W delphi było to w Windows. W lazarusie w kilku klasach. Sami w komentarzu plików pisali o delphi :-) więc odnosili się do niego @furious programming a ja myślałem, że stworzyli środowisko od nowa:-)
- Rejestracja:około 4 lata
- Ostatnio:prawie 4 lata
- Postów:204
Można dowolnie modyfikować Lazarusa, LCL oraz FPC.
Mariusz Bruniewski napisał(a):
Bo namieszali w plikach. W delphi było to w Windows. W lazarusie w kilku klasach.
W kilku modułach, nie klasach, a konkretnie w dwóch modułach. I to nie jest deklaracja takiego samego typu, a dwóch różnych typów danych — ten w module StdCtrls
przeznaczony jest dla LCL i widgetsetów, a ten w Windows
dla WinAPI. A Ty jak mieszasz LCL z WinAPI, pomijając widgetsety, to się nie dziw, że nic Ci nie działa jak należy.
Sami w komentarzu plików pisali o delphi
W wielu miejscach są komentarze, w których podane są informacje dotyczące zgodności z Delphi — dlaczego coś jest tak zadeklarowane a nie inaczej. Kompilator nie tylko Delphi wspiera, ale też inne dialekty jak choćby TP czy ISO Pascal i masę procesorów, nie tylko x86 i x64. Natomiast FCL i LCL jest napisany w taki sposób, aby wspierał wszystkie najpopularniejsze platformy, takie jak Windows, Unix, macOS, Solaris i wiele innych, a nie tylko x86. Twoje stare Delphi to się może schować.
[…] a ja myślałem, że stworzyli środowisko od nowa:-)
Środowisko jakim jest Lazarus, jest stworzone od nowa. LCL jako biblioteka komponentów też jest stworzony od nowa. Wszystko jest stworzone od nowa i rozwijane od ponad 20 lat. A to, że LCL jest silnie zgodny z VCL, to kolejny jego atut.
Sugeruję w końcu się douczyć, zrozumieć i zapamiętać to czym jest środowisko, czym kompilator a czym biblioteka komponentów, bo ciągle wszystko mieszasz i nigdy nie wiadomo o co Ci chodzi.

- Rejestracja:ponad 19 lat
- Ostatnio:około 3 lata
- Lokalizacja:Świecie
Taki kod zamieszczony po uses
pozwala mi na sprawdzenie gdzie leży błąd:
type
TOwnerDrawState = Windows.TOwnerDrawState;
lub
type
TOwnerDrawState = LCLtype.TOwnerDrawState;
private
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
protected
procedure DrawItem(Index: Integer; Rect: TRect;State: TOwnerDrawState); virtual;
type
TOwnerDrawState = Windows.TOwnerDrawState;
// kompiluje
procedure TL_ListBox.CNDrawItem(var Message: TWMDrawItem);
var
State: TOwnerDrawState;
begin
with Message.DrawItemStruct^ do
begin
State := TOwnerDrawState(LongRec(itemState).Lo); //<-------
(...)
// nie kompiluje
procedure TL_ListBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
var
Flags: Longint;
Data: String;
begin
if Assigned(FOnDrawItem) then FOnDrawItem(Self, Index, Rect, State) else // <------- wywala Error: Incompatible types: got "WINDOWS.TOwnerDrawState" expected "LCLTYPE.TOwnerDrawState" state
(...)
type
TOwnerDrawState = LCLtype.TOwnerDrawState;
// nie kompiluje
procedure TL_ListBox.CNDrawItem(var Message: TWMDrawItem);
var
State: TOwnerDrawState;
begin
with Message.DrawItemStruct^ do
begin
// State := TOwnerDrawState(LongRec(itemState).Lo); //<-------
(...)
// kompiluje
procedure TL_ListBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
var
Flags: Longint;
Data: String;
begin
if Assigned(FOnDrawItem) then FOnDrawItem(Self, Index, Rect, State) else //<-------
(...)
- Rejestracja:około 21 lat
- Ostatnio:około 2 miesiące
- Postów:1082
furious programming napisał(a):
wloochacz napisał(a):
Zawsze zakładałem że w FPC jest dokładnie tak samo.
Nie jest?W tym przypadku (wątku) chodzi o to, że typ danych o nazwie
TOwnerDrawState
jest zadeklarowany osobno w co najmniej dwóch modułach, co powoduje, że są to różne typy danych z punktu widzenia kompilatora (zresztą nawet różnią się liczbą enumów). Dlatego bardzo istotne jest to, który moduł będzie wuses
zadeklarowany jako pierwszy.
Ano tak.
Nawet w komentarzu napisałem jak sobie z tym poradzić...
To jest standardowy konflikt identyfikatorów typów, i bez skonkretyzowania o który chodzi (prefiksując go nazwą modułu źródłowego), kompilator nie ma innej opcji jak skorzystać po prostu z pierwszego napotkanego. Myślę, że w Delphi też tak było i jest.
Oczywiście że tak jest.
OP niestety nadal nie próbuje zrozumieć dlaczego jego kod się nie kompiluje i nadal nie próbuje znaleźć odpowiednich informacji w dokumentacji. Bo zamiast to zrobić, woli pisać dziwne posty, w dodatku w taki sposób, aby w nich wywyższać stare i praktycznie bezużyteczne dziś środowisko.
Typowe dla typa ;-)

- Rejestracja:około 4 lata
- Ostatnio:prawie 4 lata
- Postów:204
Z tego kodu wyżej tyle wynika, że dwa moduły przesłaniają się poprzez odpowiednie załadowanie w uses, natomiast deklaracja typu wtóry raz go przesłania. Dlatego później kompilator odnosi się do typu z LCL lub Windows. Ja bym nie używał typów z Windows bo to psuje najfajniejsza funkcje z Lazarusa - to, że LCL jest multi platformowy i ma swoje implementacje na Windows, Linuxa oraz MacOS. Ja tworząc kontrolkę pod LCL zaimplementował bym pod wszystkie 3 systemy - wtedy to ma sens. Natomiast jeśli znany jest Tobie tylko Windows, to użył bym typu z Windows i olał LCL, niemniej należy być świadomym, tego co się robi.
Metoda CreateParams
jest własnością klasy TWinControl
, która to zadeklarowana jest w module Controls
. Przyjmuje ona parametr typu TCreateParams
, który zadeklarowany jest w module LCLType
. Mało tego, w ciele tej metody nie ma niczego zależnego od platformy, bo być nie może — wtedy LCL przestałby być multiplatformowy.
Więc o jakim Windows
w ogóle mowa? :|

- Rejestracja:ponad 19 lat
- Ostatnio:około 3 lata
- Lokalizacja:Świecie
Coś zaczyna się dziać i bez nowego komponentu. Być może na tym etapie zmienię kod z Waszą pomocą. W pliku dodaję i zmieniam **C:\lazarus\lcl\stdctrls.pp **
{ TCustomListBox }
//TListBoxStyle = (lbStandard, lbOwnerDrawFixed, lbOwnerDrawVariable, lbVirtual); // lazarus
TListBoxStyle = (lbStandard, lbOwnerDrawFixed, lbOwnerDrawVariable, lbVirtual, lbVirtualOwnerDraw);
// delphi 7 - spokojnie można zostawić styl lazarusa, gdyż zawiera styl lbVirtual, lecz brakuje property OnData;
TLBGetDataEvent = procedure(Control: TWinControl; Index: Integer; var Data: string) of object; // dodaję
TSelectionChangeEvent = procedure(Sender: TObject; User: boolean) of object;
TListBoxOption = (
lboDrawFocusRect // draw focus rect in case of owner drawing
);
TListBoxOptions = set of TListBoxOption;
{ TCustomListBox }
TCustomListBox = class(TWinControl)
private const
DefOptions = [lboDrawFocusRect];
private
FCount : integer; // dodaję
FOnData: TLBGetDataEvent; // dodaję
procedure SetCount(const Value: Integer);
(...)
public
(...)
// property Count: Integer read GetCount; // for Delphi compatability
// - taki zapis w lazarusie jest **read only** dla ListBox1.Count :=
property Count: Integer read GetCount write SetCount; // delphi 7
property OnData: TLBGetDataEvent read FOnData write FOnData; // dodaję
(...)
W pliku C:\lazarus\lcl\include\customlistbox.inc
procedure TCustomListBox.SetCount(const Value: Integer);
begin
FCount := Value;
end;
procedure TCustomListBox.CreateParams(var Params: TCreateParams);
const
MultiSelectStyle: array[Boolean] of DWord = (LBS_MULTIPLESEL, LBS_EXTENDEDSEL);
begin
inherited CreateParams(Params);
if Sorted then
Params.Style := Params.Style or LBS_SORT;
if MultiSelect then
Params.Style := Params.Style or MultiSelectStyle[ExtendedSelect];
if Columns > 1 then
Params.Style := Params.Style or LBS_MULTICOLUMN;
case Style of
lbOwnerDrawFixed: Params.Style := Params.Style or LBS_OWNERDRAWFIXED;
lbOwnerDrawVariable: Params.Style := Params.Style or LBS_OWNERDRAWVARIABLE;
lbVirtual : Params.Style:= Params.Style and (not LBS_HASSTRINGS) or LBS_NODATA or LBS_OWNERDRAWFIXED;
// lbvirtual dodaję
end;
Params.Style := Params.Style or
(WS_HSCROLL or WS_VSCROLL or LBS_NOINTEGRALHEIGHT or LBS_HASSTRINGS or LBS_NOTIFY);
end;
Wywołanie zmienionego kodu w lazarusie. - tak jak to działa pod Delphi 7 prawidłowo wyświetla miliony linii w kontrolce TListBox w sekundy:
var
Form1: TForm1;
MyList : TStringlist;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyList.Free;
end;
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
var Data: string);
begin
Data := MyList[Index];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyList := TStringlist.Create;
ListBox1.Style := lbVirtual;
end;
procedure TForm1.Button1(Sender: TObject);
begin
MyList.LoadFromFile('ex.txt');
ListBox1.Count := MyList.Count;
end;
end.
W Narzędzia Lazarus-> [Window Title] Potwierdzenie [Content] Chcesz przebudować Lazarusa według profilu: Normalne IDE? [Tak] [Nie] — przebudowany Lazarus.
Sugeruję nie dłubać przy bazowych klasach LCL i nie modyfikować ich kodu źródłowego na własną rękę, bo z tych samych klas zbudowany jest cały Lazarus. Tak więc jeśli nadupczysz w nich głupot i przebudujesz Lazarusa, to popsujesz całe IDE (wszystkie kontrolki danego typu we wszystkich oknach w IDE szlag trafi) i będziesz musiał je reinstalować. :D
Jak chcesz zrobić swój komponent, to napisz swoją klasę i na niej się baw. Możesz też skopiować cały kod np. TCustomListBox
, zmienić mu nazwę na własną, doinstalować do palety komponentów i na nim eksperymentować do woli. Ale nie rób tego z bazowymi klasami LCL.




- Rejestracja:około 21 lat
- Ostatnio:około 2 miesiące
- Postów:1082
Mariusz Bruniewski napisał(a):
Coś zaczyna się dziać i bez nowego komponentu. Być może na tym etapie zmienię kod z Waszą pomocą. W pliku dodaję i zmieniam **C:\lazarus\lcl\stdctrls.pp **
To jest jeden z głupszych pomysłów jakie ostatnio widziałem.
@furious programming już Ci napisał, że to jest pomysł z czapy.
Generalnie nie powinno się tak robić, ponieważ zamykasz sobie drogę prostej migracji do nowszych wersji.
Oczywiście możesz dalej zaklinać rzeczywistość, że "niczego nie zmieniasz tylko dodajesz" (sic!) i rób jak chcesz.
Ale wbij sobie w końcu do głowy, że to Ty się nie znasz i robisz wszystko na opak i byle jak; byle dopchnąć kolanem, związać sznurkiem i "działa".
BTW - skoro niczego nie zmieniasz a tylko dodajesz to może wykorzystać standardową metodę dziedziczenia do własnej klasy i nadpisania zmian jak się chce?
Że się nie da zrobić pewnych rzeczy?
Oczywiście, że się da (znajomość biblioteki DDetours się kłania), włącznie z dostępem do wszystkiego (np. do sekcji `private') jak się uprzeć.
I dalej będzie to lepsze i bezpieczniejsze rozwiązanie niż gmeranie w kodzie źródłowym bibliotek standardowych.



- Rejestracja:około 9 lat
- Ostatnio:około 3 godziny
- Postów:5108
muszę przyznać że podoba mi się pomysł z modyfikowaniem standardowych bibliotek
nie dlatego że to dobry pomysł, ale dlatego że można

- Rejestracja:ponad 19 lat
- Ostatnio:około 3 lata
- Lokalizacja:Świecie
Dziękuję wszystkim za wyrażenie opinii w moim poście. Temat uważam za zamknięty. Okazało się, że należało szukać odpowiedzi tam gdzie nie pisaliście.
łac. Iucundi acti labores (miłe są trudy zakończone)
Wyobraźnia jest ważniejsza od wiedzy, ponieważ wiedza jest ograniczona. - Albert Einstein
Wyobraźnia bez wiedzy może stworzyć rzeczy piękne. Wiedza bez wyobraźni najwyżej doskonałe.- Albert Einstein
Logika zaprowadzi Cię z punku A do punktu B. Wyobraźnia zaprowadzi Cię wszędzie. - Albert Einstein

- Rejestracja:ponad 22 lata
- Ostatnio:około 5 godzin
- Postów:496
Panie szefie! Powinieneś stopy całować niektórym forumowiczom za ich czas i wiedzę, którą starają ci się przekazać. A ty tylko się wymądrzasz i strzelasz fochy. Ludzie chcą ci pomóc, a ty z nich drwisz i śmiesz pisać, że się nie znają? Notorycznie piszesz jakbyś był co najmniej upalony, zero poprawnej polszczyzny, chaos i zarozumialstwo! Ogarnij się człowieku i wesprzyj te forum tym milionem, jak już wygrasz w to lotto...




Mariusz BruniewskiMariusz BruniewskipragmaticdevWypierdzistypragmaticdev