Problem klas delphi na lazarusa

Problem klas delphi na lazarusa
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

W procedurze podczas kompilacji występuje błąd przy Height jako Error: Duplicate identifier "Height"

Kopiuj
protected
   procedure MeasureItem(Index: Integer; var Height: Integer); virtual;

procedure TL_ListBox.MeasureItem(Index: Integer; var Height: Integer);
begin
  if Assigned(FOnMeasureItem) then FOnMeasureItem(Self, Index, Height)
end; 

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@furious programming L_Listbox.pas kompiluje się jednak w dalszym ciągu nie mogę podświetlić items :-( kod ze strony https://github.com/project-jedi/jvcl/blob/master/jvcl/run/JvColorCombo.pas

Kopiuj
function ItemStateToOwnerDrawState(const AState: Word): TOwnerDrawState;
begin
  Result := [];

  if AState and ODS_CHECKED      <> 0 then Result += [odChecked];
  if AState and ODS_COMBOBOXEDIT <> 0 then Result += [odComboBoxEdit];
  if AState and ODS_DEFAULT      <> 0 then Result += [odDefault];
  if AState and ODS_DISABLED     <> 0 then Result += [odDisabled];
  if AState and ODS_FOCUS        <> 0 then Result += [odFocused];
  if AState and ODS_GRAYED       <> 0 then Result += [odGrayed];
  if AState and ODS_HOTLIGHT     <> 0 then Result += [odHotLight];
  if AState and ODS_INACTIVE     <> 0 then Result += [odInactive];
  if AState and ODS_NOACCEL      <> 0 then Result += [odNoAccel];
  if AState and ODS_NOFOCUSRECT  <> 0 then Result += [odNoFocusRect];
  if AState and ODS_SELECTED     <> 0 then Result += [odSelected];
end;        

procedure TL_ListBox.CNDrawItem(var Message: TWMDrawItem);
var
  State: TOwnerDrawState;
begin
  with Message.DrawItemStruct^ do
  begin
    State := ItemStateToOwnerDrawState(itemState);  

    FCanvas.Handle := hDC;
    FCanvas.Font := Font;
    FCanvas.Brush := Brush;
    if (Integer(itemID) >= 0) and (odSelected in State) then
    begin
      FCanvas.Brush.Color := clHighlight;
      FCanvas.Font.Color := clHighlightText
    end;
    if Integer(itemID) >= 0 then
      DrawItem(itemID, rcItem, State) else
      FCanvas.FillRect(rcItem);
    if odFocused in State then DrawFocusRect(hDC, rcItem);
    FCanvas.Handle := 0;
  end;
end; 

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
Nawet, gdy wykonam State := ItemStateToOwnerDrawState(LongRec(itemState).Lo);
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Kolejna wskazówka komponent zachowuje się jakby na niego był nałożony ReadOnly := True;
Nie mogę na MultiSelect ani zastosować True lub False; Kiedy dodam poniższy kod co do tej pory w kontrolce L_LISTBOX nie było nic nie uzyskuję tym ...

Kopiuj
{ReadOnly}

TL_ListBox = class(TListBox) 
private
    FReadOnly : Boolean;

protected
    property ReadOnly: Boolean Read FReadOnly Write FReadOnly Default False;

constructor L_LISTBOX.Create(AOwner: TComponent);
Begin
  FReadOnly := False; 

{MultiSelect}

 TL_ListBox = class(TListBox) 
  private 
    FMultiSelect: Boolean; 
    procedure SetMultiSelect(Value: Boolean); 

  protected 
    property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default False; 

  published 
    property MultiSelect; 

procedure TL_ListBox.SetMultiSelect(Value: Boolean); 
begin 
  if FMultiSelect <> Value then 
    FMultiSelect := Value; 
 end; 


  • ex1.JPG (18 KB) - ściągnięć: 12

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 8x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Kolejny komponent, który da się bez problemu skompilować w lazarusie. Można wybrać items w przenośni bo to nie items.strings. Wadą jest, że o kilka sekund dłużej mysle, że lo 1/2 dłużej łądują się dane z pliku niż przy TListBox delphi. No i kiedy dane są w milionach w kontrolce suwak nie działa płynnie. Jakby było brak odświeżania kontrolki. Kod https://github.com/USEPA/EPANET-legacy-user-interface/blob/master/components/VirtList.pas

Wywolanie Posiada VirtualListBox1.Count := MyList.Count;

Kopiuj
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, VirtualListBox, Buttons, Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    VirtualListBox1: TVirtualListBox;
    procedure VirtualListBox1GetItem(Sender: TObject; Index: Integer;
      var Value: String; var aColor: TColor);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    MyList : TStringlist;
   TimeA,TimeB: TDateTime;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 MyList := TStringlist.Create;

 TimeA := StrtoDateTime(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now));
 MyList.LoadFromFile('ex.txt');

 VirtualListBox1.Count := MyList.Count;

 TimeB := StrtoDateTime(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now));

 Caption := TimeToStr(TimeB-TimeA);
end;

procedure TForm1.VirtualListBox1GetItem(Sender: TObject; Index: Integer;
  var Value: String; var aColor: TColor);
begin
   Value := Mylist[index];
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyList.Free;
end;
  • ex1.JPG (28 KB) - ściągnięć: 24

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 7x, ostatnio: Mariusz Bruniewski
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1
Mariusz Bruniewski napisał(a):

Wadą jest, że o kilka sekund dłużej mysle, że lo 1/2 dłużej łądują się dane z pliku niż przy TListBox delphi. No i kiedy dane są w milionach w kontrolce suwak nie działa płynnie. Jakby było brak odświeżania kontrolki. Kod https://github.com/USEPA/EPANET-legacy-user-interface/blob/master/components/VirtList.pas

Skoro przy takiej ilości danych (co w sumie jest bez sensu, ponieważ powinieneś mieć proxy na te dane, jeśli chcesz mieć super wydajnie i responsywnie) masz dziwne problemu, to dlaczego nie użyjesz czegoś co zostało specjalnie do tego napisane?
O tego (dla FPC i oczywiście do zawsze jest wersja dla Delphi):
https://github.com/blikblum/VirtualTreeView-Lazarus

I po temacie.
Chociaż nie do końca, jeżeli dalej będziesz ładował te dane do StringListy :D

Mariusz Bruniewski
Mariusz Bruniewski
TStringList mi wystarczy przy 14 mln lini to około 1100 Mb w pamięci. To const dla programu. Reszta jest zmiejszana w pamięci.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:23 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0
Mariusz Bruniewski napisał(a):

@furious programming L_Listbox.pas kompiluje się jednak w dalszym ciągu nie mogę podświetlić items :-(

Sprawdź pod debuggerem jak wygląda słowo z Lo i czy bit dotyczący stanu ODS_SELECTED jest zapalony. Jeśli nie, to problemem nie jest konwersja, a dane dostarczane przez komunikat. A że całością steruje widgetset, to znalezienie przyczyny problemu może być bardzo trudne.


wloochacz napisał(a):

O tego (dla FPC i oczywiście do zawsze jest wersja dla Delphi):
https://github.com/blikblum/VirtualTreeView-Lazarus

Sugerowaliśmy to już kilka razy, ale OP jest uparty i na siłę chce wykorzystać ListBoxa.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Mariusz Bruniewski
Mariusz Bruniewski
@furious programming Bo cudo powstało na Tlistbox. Nawet nie jesteś wstanie sobie wyobrazić ogromu pracy i inspiracji. Teraz chce iść drogą łatwej konwersji typów.
Mariusz Bruniewski
Mariusz Bruniewski
Po drugie OP zwraca się do geniuszy, a oni dają wciąż zamienniki. To nie lekarstwa to kod, który ma działać! Napisz wprost, że nie da się, a nie że po co tyle linii pakuję w kontrolkę a za chwile przedstawiasz kontrolkę, która potrafi wyświetlać linie w milionach ... Post dotyczy konwersji a nie sugestii innej kontrolki!
Mariusz Bruniewski
Mariusz Bruniewski
Jooooo
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@wloochacz Wyobraź sobie ostatnie losowanie Lotto (Duży Lotek) z dnia 25-03-2021 r. To liczby: 2021-03-25 05 19 34 43 44 46
Przedstawie Tobie filtry w postaci screenów :-) Jak widzisz na obraz ex2 dane nie są ładowane do listy. Obraz ex3 to 3 parzyste 3 nieparzyste. Kolejny filtr np. Dalej wyobraź sobie, że z rozkładu normalnego Gaussa potrafisz wskazać, że w tym losowaniu wypadnie liczba np. 46 - obraz ex4 Obraz ex5 2 niskie 4 wysokie. Obraz ex6 przedstawia prawdopodobieństwo :-) Mogę dalsze filtry stosować. Zatem o czym ty do mnie mówisz :-) To jest błędem stosowania znacznej ilości do TListBox? Jesteś w błędzie. To samo o czym pisałeś ja stosuje.

  • ex1.JPG (122 KB) - ściągnięć: 24
  • ex2.JPG (40 KB) - ściągnięć: 24
  • ex3.JPG (62 KB) - ściągnięć: 32
  • ex5.JPG (60 KB) - ściągnięć: 24
  • ex6.JPG (29 KB) - ściągnięć: 29
  • ex4.jpg (61 KB) - ściągnięć: 20

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
Szalony Programista
Szalony Programista
Ciekawe staystyki, ale w tym przypadku rozkład gaussa nie będzie dobrym rozkładem bo dla lotto rozkład jest płaski, jednostajnie ciągły i gęstość prawdopodobieństwa jest dla każdej kulki identyczna.
Mariusz Bruniewski
Mariusz Bruniewski
Dobre spostrzeżenie. Każda liczba występuje x razy tyle samo. Dokładnie 1 712 304. Zatem trzeba umieć szukać gaussa tam gdzie występuje :-)
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@Szalony Programista to z populacji. Przy rozkładzie z próby x prób np. 100 rozkład normalny gaussa zostanie zachowany ;-)


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
szatkus
Te wykresy pokazują, że Lotto podaje liczby od najmniejszej do największej?
Mariusz Bruniewski
Mariusz Bruniewski
Lotto nic nie podaje to wszystkie kombinacje Lotto czyli liczb od 1 do 49. Tak rozkładają się liczby i ich prawdopodobieństwa wystąpień w populacji w rzędach.
szatkus
@Mariusz Bruniewski: nawet ładne, ale co właściwie ma z nich wynikać?
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@szatkus jeśli nie umiesz czytać statystyk to nic nie wyniknie dla ciebie. Dla mnie ten np. wykres dużo mówi (stanowi) w populacji jakie liczby stosować. Następnie odnoszę to do próby danego trendu.

  • ex8.JPG (133 KB) - ściągnięć: 27
  • ex7.JPG (93 KB) - ściągnięć: 25

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 3x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Myślę, że Pan @Adam Boduch admin zna konwersję. Od początku brnął od delphi 6.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Krzywa dzwonowa dla gdy Mini lotto i jej ciekawe wykresy :-)


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

No dobrze przedstawcie kod, w którym odczytam dane w 6s z pliku txt 14 mln linii. Kod ma działać w lazarusie! Pytanie poprzez negację. Nikt takiego kodu nie wystawił Ja wystawiłem. Czekam ... nie na kody lecz na demo... I zostałem skrytykowany po co te linie ładować do kontrolki? Chyba programiści zadając mi te pytanie jeszcze działają na systemie Windows XP i z systemem pamięci poniżej 2GB.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 4x, ostatnio: Mariusz Bruniewski
Szalony Programista
Szalony Programista
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:227
0

Jeśli chodzi o optymalizacje, to można powiedzieć że jestem jaroszem.

Wczytać cały plik do pamięci i później do kontrolki listbox, prawdopodobnie będzie wyglądało tak, że system wczyta plik z opóźnieniem(hdd/ssd/internet) do pamięci ram, a później całą tą pamięć znaki ASCII wyrenderuje w buferze zastosowując określoną czcionkę, która będzie przekopiowywana do listboxa w zależności od ustawienia scrollbara.

Można też wczytywać plik w partiach lub zastosować mapowanie pliku wtedy system zajmie się wczytywaniem(zwykle opóźnionym do czasu próby odczytu) z dysku.

Te dane można wyświetlić w sumie na takie powiedzmy 3 sposoby.

Pierwszy to cały plik do listboxa.
Drugi załadować pierwsze 1-10 tys linijek i jeśli scrollbar dojdzie do 90-100% końca to doładować kolejne 1-10 tys linijek dodając do już istniejących append. Nazwa tego to infinite loading.
Trzeci to dodać buttony < >, załadować pierwszą stronę np. 1 tyś linijek i po kliknięciu przycisku next, załadować do listboxa następną stronę, nadpisując zawartość listboxa.

Można by było też popatrzeć na profilerze jak wypada nasz program i co go mocno spowalnia.
Ciekawe statystyki i wnioski można uzyskać na temat naszego programu.

Zobacz pozostały 1 komentarz
Szalony Programista
Szalony Programista
Hmm, zakładałem, że sobie pobrał wygrane kombinacje ze strony lotto i na ich podstawie liczy, ale jeśli wygenerował to co innego.
Szalony Programista
Szalony Programista
~14 mln jest dokładnie kombinacji 49*48*47*46*45*44/6!
szatkus
Też tak myślałem. A w tym wypadku można po prostu na podstawie pozycji scrolla wygenerować sobie powiedzmy 100 kolejnych kombinacji i wyświetlić. Pewnie by to zajęło megabajt zamiast gigabajta.
szatkus
Postanowiłem zrobić sobie z tego kata https://jsfiddle.net/dxgc1u0h/
Mariusz Bruniewski
Mariusz Bruniewski
@Szalony Programista dobrze myślisz. Dawno a dokładnie 12 lat temu brałem to pod uwagę, gdy zacząłem pisać program. Jednak zdecydowałem się na tworzenie plików z racji tego, że mogę w każdej chwili do nich wrócić. Po drugie @szatkus tak oczywiście jednak jeśli kod nie jest pod obciążeniem, czyli z (łac.) idem per idem - to samo przez to samo :-)
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
0

Nie żyjemy w czasach WXP - po prostu to jest głupie co robisz. Właśnie przez prędkość odczytywania nie ma sensu ramu zaśmiecać... Ale Twoja sprawa. Nie jest też wyczynem zrobienie takiego kodu jak proponujesz bo to wymaga raptem 180MB/s odczyty z dysku przy unicode a przy ANSI czy formacie binarnym jeszcze mniej. Zresztą do takich rzeczy wybrałeś źle narzędzie. Do analizy takich danych to ja bym użył SASsa Matlaba, Octave... A nie kompilowany język do robienia apel z GUI miedzyplatformowo... O ile w ogóle analiza statystyczna gry losowej ma jakikolwiek cel. Juz mądrzejsze jest analizowanie trwałości żarówek celem odkrycia wzorca spisku.

edytowany 3x, ostatnio: pragmaticdev
Mariusz Bruniewski
Mariusz Bruniewski
Dziękuje za sugestie :-) Jednak uwierz mi dobrze myślę :-)
Mariusz Bruniewski
Mariusz Bruniewski
Po drugie wspomniałem już wcześniej, że wszystko jest uzależnione od TStringList. W trybie lbVirtual kontrolki TListBox oraz property OnData - pamięć nie znacznie wzrasta w stosunku do TStringList :-) Zatem zapytaj mnie po co pcham do TStringList tyle danych a nie do kontrolki :-) Odpowiedz poprzez negacje :-)
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Wskazuje kod ze strony https://github.com/alrieckert/lazarus/blob/master/lcl/lcltype.pp

Kopiuj
// ToDo: move this to StdCtrls
  TOwnerDrawStateType = (
    odSelected, odGrayed, odDisabled, odChecked,
    odFocused, odDefault, odHotLight, odInactive, odNoAccel,
    odNoFocusRect, odReserved1, odReserved2, odComboBoxEdit,
    odPainted  // item already painted
    );
  TOwnerDrawState = set of TOwnerDrawStateType;

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@furious programming Wygląda na to, że cały czas broi state
Sprawdzałem na delphi 7

Kopiuj
 //State := TOwnerDrawState(LongRec(itemState).Lo);  {jeśli wykluczę w d7 to załącznik ex podczas kliknięcia na items wygląda to tak jak na obrazku.
W lazarusie mam wrażenie, że na kontrolkę jest nałożony  Readonly. 
Kiedy modyfikuje za Twoją pomocą state lub, gdy go w ogóle nie zastosuje mam taki efekt sam jak w d7}
State := TOwnerDrawState(LongRec(itemState).Lo);     {jeśli zastosuję to załącznik ex1}
  • ex.JPG (19 KB) - ściągnięć: 18
  • ex1.JPG (19 KB) - ściągnięć: 22

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 5x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@pragmaticdev załadowane do kontrolki 2 miliardy linii. Jak myślisz, czy pamięć *.exe wzrosła? W żaden sposób :-) Gdybyś chciał dokonać zrzutu tego co jest w kontrolce dysku by Tobie zabrakło. Czas utworzenia danych w kontrolce poniżej jednej sekundy :-) Zatem to nie problem kontrolki, lecz Ty odpowiedz znasz :-) Ja również :-) Po drugie są programy do odzyskiwania danych po sektorowych z dysku. Potrafią dane np. 1TG odczytać w kontrolce jak te dane wyglądają dla oka :-)


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
LA
  • Rejestracja:ponad 11 lat
  • Ostatnio:dzień
  • Postów:470
1

https://www.filmweb.pl/film/Rain+Man-1988-1008 ten film pasuje mi do tego wątku - czy ktoś ma podobne odczucia?

Mariusz Bruniewski
Mariusz Bruniewski
Jakoś romantyczny jesteś. To zapewne Twoja prawa półkula w mózgu dziala poprzez alalogie do wartosci semestralnych. Jednak kod to domena lewej półkuli mózgowej.
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
3

Mi się wydaje, że ktoś zbliżył się za bardzo do czarnej dziury i zajrzał poza horyzont zdarzeń. Miliardy alokacji pamięci, nie zwiększające pamięci procesu. Dane wczytywane ze strumienia świadomości bo nie z dysku - nie ma takich dysków twardych co by to zmieściły. Mistycznie odczytywane Tera Gajty danych z kontrolek, które zaczytały tylko miliardy linii (chyba jakiejś świadomości). Hemoglobina przez negację ;-). Ta łamana polszczyzna, to wyciek czasu z przyszłości, która łączy się z przeszłością 12 lat temu kiedy to się zaczęło. Ten program już istniał i nie istniał i jest w tym wszystkim doskonały. Billy uderzaj, uderzaj, uderzaj. Wybaczcie ale ten post nie wnosi do tematu mniej niż poprzednie posty autora. Ewakuuje się na Xandar, bo Borg trzyma dla mnie portal. Żyjcie w pokoju na tym ziemskim padole i uważajcie ze wczytywaniem miliardów danych bez alokacji bo naruszycie spójność wszechrzeczy. Pokój i TStringLista z Wami.

Mariusz Bruniewski
Mariusz Bruniewski
Dobre :-)
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Tak sobie pomyślałem ile wynosi State czy tyle co const czy tyle co zmienna?


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 2x, ostatnio: Mariusz Bruniewski
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:23 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0

A jaśniej?


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Zobacz pozostałe 5 komentarzy
Mariusz Bruniewski
Mariusz Bruniewski
@cerrato to jak jest w końcu w tym forum? Można wątki zaśmiecać niemerytorycznie? i jeszcze władzę do tego mieszać. Twoje osobiste frustracje nie ładuj na polityce tylko na osobistym wizerunku :-)
cerrato
offtopowanie w komentarzach raczej nie jest to większą zbrodnią niż wyrzucenie peta przez okno samochodu ;)
WL
Chcesz kodu to sobie napisz. Ja nie prowadzę piekarni, a kod to nie bułki. Poza tym pisałem ci, w zaklinanie rzeczywistości się nie bawię, a męczyć się z twoim syfem nie mam zamiaru i nie masz lewara by ten zamiar się pojawił. Kiedyś na pewno dałbym się podpuścić, ale to kiedyś. Ale tak z ciekawości - o jaki dokładnie kod pytasz @Mariusz Bruniewski?
Mariusz Bruniewski
Mariusz Bruniewski
odpoczywaj :-) Jesteś slaby i @wloochacz jeśli ktoś pisze syf. To ....
flowCRANE
Nie da się odpowiedzieć na pytanie, jeśli samo pytanie jest kompletnie niejasne. Pytam o szczegóły, proszę, żebyś konkretnie opisał problem, a Ty marnujesz czas na pisanie bzdur w komentarzach, zamiast napisać post i wyjaśnić dokładnie w czym problem. Przy okazji — komentarze służą do dyskusji pobocznych, niemerytorycznych.
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Powracam do wątku, gdyż nie dawał mi spokoju. Kod okroiłem do State, aby zobaczyć, gdzie w jakim uses znajduje się State nawiązując do https://bugs.freepascal.org/view.php?id=19958 StdCtrls następnie Windows Miałem tak i wywalał error, gdy Windows jest na końcu po LCL kompiluje się.

Kopiuj
unit L_LISTBOX;

 {$mode objfpc}{$H+}

interface

    // do tej pory miałem tak : L_ListBox.pas Error: Illegal type conversion: "Word" to "TOwnerDrawState"
    {uses Math, StdCtrls, Controls, Classes, Forms, Graphics, Messages, Windows, SysUtils, Commctrl, Types,
         LResources, LCLType, LCLIntf, LMessages, LCLClasses;}

    // gdy zrobilem tak: Kompilacja pakietu LLB 0.0: Zakończony powodzeniem, Podpowiedzi: 1
    uses Math, StdCtrls, Controls, Classes, Forms, Graphics, Messages{, Windows}, SysUtils, Commctrl, Types,
         LResources, LCLType, LCLIntf, LMessages, LCLClasses, Windows;

    type
    TL_ListBox = class(TlistBox)
    private
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    protected
    public
    published
    end;

  procedure Register;

  implementation

  uses RTLConsts;

  procedure Register;
  begin

   RegisterComponents('ex',[TL_ListBox]);
  end;

{ TL_ListBox }

procedure TL_ListBox.CNDrawItem(var Message: TWMDrawItem);
var
  State: TOwnerDrawState;
begin
  with Message.DrawItemStruct^ do
  begin
    ...
    State := TOwnerDrawState(LongRec(itemState).Lo); //delphi i lazarus
    ...
  end;
end;

end.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 2x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

W pliku StdCtrls.pp jest

Kopiuj
type 
TOwnerDrawState = LCLType.TOwnerDrawState;

W pliku: LCLType.pp

Kopiuj

  // ToDo: move this to StdCtrls
  TOwnerDrawStateType = (
    odSelected, odGrayed, odDisabled, odChecked,
    odFocused, odDefault, odHotLight, odInactive, odNoAccel,
    odNoFocusRect, odReserved1, odReserved2, odComboBoxEdit,
    odPainted  // item already painted
    );
  TOwnerDrawState = set of TOwnerDrawStateType;

Jak połączyć typy z Delphi ?

Kopiuj
Vcl.StdCtrls.TOwnerDrawState

type TOwnerDrawState = set of (
   odSelected, odGrayed, odDisabled, odChecked, 
   odFocused, odDefault, odHotLight, odInactive, 
   odNoAccel, odNoFocusRect, odReserved1, odReserved2, odComboBoxEdit);

// w Lazarusie 14 typów w delphi 13
type
 TOwnerDrawState = Vcl.StdCtrls.TOwnerDrawState = LCLType.TOwnerDrawState = 
set

@furious programming funkcja przedstawiona przez Ciebie zawiera 11 stanów:

Kopiuj
function ItemStateToOwnerDrawState(const AState: Word): TOwnerDrawState;
begin
  Result := [];

  if AState and ODS_CHECKED      <> 0 then Result += [odChecked];
  if AState and ODS_COMBOBOXEDIT <> 0 then Result += [odComboBoxEdit];
  if AState and ODS_DEFAULT      <> 0 then Result += [odDefault];
  if AState and ODS_DISABLED     <> 0 then Result += [odDisabled];
  if AState and ODS_FOCUS        <> 0 then Result += [odFocused];
  if AState and ODS_GRAYED       <> 0 then Result += [odGrayed];
  if AState and ODS_HOTLIGHT     <> 0 then Result += [odHotLight];
  if AState and ODS_INACTIVE     <> 0 then Result += [odInactive];
  if AState and ODS_NOACCEL      <> 0 then Result += [odNoAccel];
  if AState and ODS_NOFOCUSRECT  <> 0 then Result += [odNoFocusRect];
  if AState and ODS_SELECTED     <> 0 then Result += [odSelected];
end;

LCLType.pp

Kopiuj
//itemState
ODS_SELECTED     = $0001;
ODS_GRAYED       = $0002;
ODS_DISABLED     = $0004;
ODS_CHECKED      = $0008;
ODS_FOCUS        = $0010;
ODS_DEFAULT      = $0020;
ODS_HOTLIGHT     = $0040;
ODS_INACTIVE     = $0080;
ODS_NOACCEL      = $0100;
ODS_NOFOCUSRECT  = $0200;
ODS_COMBOBOXEDIT = $1000;

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

O ile pamiętam w uses w Delphi ładowanie nie jest skomplikowane. W lazarusie dowiaduje się, że to co zamieszczamy w uses musi być uporządkowane w architekturze projektu. Dla starszych wersji delphi obojętne było czy Windows będzie na początku czy na końcu.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:23 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0

No to źle pamiętasz.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
furious programming napisał(a):

No to źle pamiętasz.

Nie, no bez przesady.
Rozumiem że OP jest konsekwentnie irytujący i nie warto mu odpowiadać, ale...

W Delphi to faktycznie nie ma znaczenia, co do zasady.
Oczywiście są wyjątki, jak menadżer pamięci albo zabawy z subclassing lub też przy fikołkowym kodzie w sekcji initialization danego modułu.
Tak wtedy ta kolejność ma (menadżer pamięci) i może (nie ma reguły, ale może) mieć znaczenie.

Zawsze zakładałem że w FPC jest dokładnie tak samo.
Nie jest?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:23 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0
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 w uses zadeklarowany jako pierwszy.

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.

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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
Zobacz pozostałe 6 komentarzy
Szalony Programista
Szalony Programista
@Mariusz Bruniewski: próbowałeś jakiś innych języków programowania prócz Delphi?
flowCRANE
@Mariusz Bruniewski: dobry żart! :D :D :D
PR
pragmaticdev
@furious programming: można kupić licencję na stare Delphi. Nie wiem skąd pomysł, że nie można...
Mariusz Bruniewski
Mariusz Bruniewski
@pragmaticdev niestety dawniej borland, embarcadero nie dają możliwości wznowienia licencji dla d7. Gdybym np. zakupił d7 enterprische, professjonal np. z allegro nic mi to nie da. Użytkownik, który otrzymał licencję aktywował w tamtym czasie licencję na swoje dane. Licencja w borlandzie była zawarta pomiędzy firmą a użytkownikiem i nie mogła być przenoszona na potomka użytkownika :-)
PR
pragmaticdev
Bzdury. Normalnie kupujesz od Idery licencję na RAD Studio najnowsze i w ciągu 6 miesięcy masz prawo do downgradu do dowolnej wersji. Dostaje się kod osobny i link do instalki. W ostatnich latach kupowałem licencji za ponad 100k i downgradowalem do niższych wersji. Więc jak masz pirata to nie możesz się usprawiedliwić bo możesz kupić normalnie licencję na D7.
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Po drugie dlatego wciąż nie mam tego czego oczekuję....

  • fp.JPG (71 KB) - ściągnięć: 24

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:23 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0

Ty naprawdę myślisz, że skoro na co dzień używam Lazarusa, to nie mam bladego pojęcia o Delphi? :D


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@pragmaticdev jak odnieść się do tego http://cc.embarcadero.com/Item/26618?


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)