[trochę NTG] freepascal, lazarus i forma

Nov 13, 2013 16 Replies

Ktoś tu się kiedyś chwalił że ogarnia FreePascala i IDE Lazarusa, więc przedstawię problem. Mam taki kod:



StringGrid1.Cells[1,i]:=Format('%s', [osobniki[i].genotyp]);



który oczywiście nie działa, komórki w kolumnie numer 1 w moim StringGrid1 wyświetlają się puste. Pole genotyp w strukturze osobniki jest typu string o stałej długości 8 znaków. Co ciekawe gdy odwołam się do pojedynczego znaku ze stringa, np. tak:



StringGrid1.Cells[1,i]:=Format('%s', [osobniki[i].genotyp[1]]);



to wtedy ten pojedynczy znak mi się wyświetla. Dlaczego nie mogę wyświetlić stringa w całości?


U¿ytkownik "Jakub Rakus" napisa³ w wiadomo¶ci news:l60ugq$r79$ snipped-for-privacy@node2.news.atman.pl...

Zak³adaj±c, ¿e w³a¶ciwie indeksujesz "i", to kod wygl±da na poprawny. Przynajmniej w Delphi na pewno by zadzia³a³o. Mo¿e podaj deklaracjê tablicy "osobniki" oraz strukturê jej elementów (rekordu).

Pzdr. Marek

W dniu 2013-11-13 23:29, Jakub Rakus pisze:

  1. Nie bardzo rozumiem w jakim celu używasz Format do stringa. W takim przypadku Format robi po prostu kopię stringa.
  2. Spróbuj Format('%0:s', [osobniki[i].genotyp])

JK

Osobniki to tablica elementów stworzonego przeze mnie typu:

type fenotyp = record numer: byte; genotyp: string[8]; fun_przyst: integer; wyc_kola_rul: real; end;

Chcę mieć (później) możliwość formatowania tego co będzie pokazywane na ekranie. Zresztą zwykłe przypisanie też nie działa.

Próbowałem, niestety efektów brak.

Bo nie zadziała, w Delphi też nie. Aby wyświetlić zawartość StringGrid, musisz przechwycić event: OnDrawCell K.

Chyba się nie zrozumieliśmy, ja nie chce wyciągać tego co jest w komórce StringGrida tylko chcę do niej wpisać jakieś tam stringa. Co idealnie działa gdy robię np. tak: StringGrid.Cells(x,y):='jakiś tekst' albo tak: my_string:='jakiś tekst'; StringGrid.Cells(x,y):=my_string; ale NIE DZIAŁA jak chcę do tej komórki wrzucić jedno z pól typu złożonego, przy czym to jedno konkretne pole jest typu string.

Ja też próbowałem. I działa. Sprawdź czy aby na pewno poprawnie zapisujesz dane do tablicy, tzn. czy pod indeksem i są jakiekolwiek dane.

JK

Napisz jakiś _bardzo_krótki_ program i wyślij go na grupę. Może problem leży w braku przydzielonej pamięci? Przypomnę, że StringGrid.Cells(x,y) z konkretnym x i y, musi wcześniej istnieć, ustawiając np: StringGrid1.ColCount StringGrid1.RowCount K.

Bzdura.

Kolejna bzdura.

Pzdr. Marek

A czy temu string-owi "genotyp" jest przypisywany tekst zawieraj±cy polskie znaki (z ogonkami, kreseczkami)? Je¶li nie, to je¶li np. bêdzie 'abcdefg', to te¿ nie dzia³a?

Pzdr. Marek

procedure TForm1.Button1Click(Sender: TObject);populacji początkowej var i: integer; begin ilosc_osobnikow:=SpinEdit1.Value; StringGrid1.Clear; StringGrid1.RowCount:=ilosc_osobnikow+1; for i:=1 to ilosc_osobnikow do begin osobniki[i].numer:=i; osobniki[i].genotyp:=permutacja(8); end; for i:=1 to ilosc_osobnikow do begin StringGrid1.Cells[0,i]:=Format('%d', [osobniki[i].numer]); StringGrid1.Cells[1,i]:=Format('%s', [osobniki[i].genotyp]); end; end;

Kolumny stworzone we właściwościach StringGrida, tak żeby miały już konkretne nazwy, szerokości etc. Zresztą jak wrzuce do kolumny numer 1 jakąś wartość numeryczną to ją widzę.

A kompilujesz to pod windowsem czy linuxem? Może sprawa leży po stronie konfiguracji środowiska? Wartości osobniki.genotyp na pewno są tworzone bo w dalszej części programu inne procedury wyliczają na ich podstawie różne wartości liczbowe i wartości te otrzymuje poprawne (wyświetlam je w innym StringGridzie). A teraz ciekawostka: zrobiłem sobie na szybko idiotyczną funkcję, która wyciąga z mojego stringa kolejne znaki i skleja je w nowego stringa - wtedy się to wyświetla, o co tu chodzi?

[...]
[...]

Bzdurnyś bzdurnik, albo niedouczony student. K.

Prosiłem o krótki program, ten co przysłałeś pozwoliłem sobie uprościć do problemu StringGrid:

unit Unit1;

interface

uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.Samples.Spin;

type TForm1 = class(TForm) Button1: TButton; StringGrid1: TStringGrid; SpinEdit1: TSpinEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); var i: integer; ilosc_osobnikow : integer; begin ilosc_osobnikow := SpinEdit1.Value; //StringGrid1.Clear; StringGrid1.RowCount:=ilosc_osobnikow+1; // for i:=1 to ilosc_osobnikow do // begin // osobniki[i].numer:=i; // osobniki[i].genotyp:=permutacja(8); // end; for i:=1 to ilosc_osobnikow do begin StringGrid1.Cells[0,i]:= 'abc'; //Format('%d', [osobniki[i].numer]); StringGrid1.Cells[1,i]:= 'def'; //Format('%s', [osobniki[i].genotyp]); end; end;

end.

Ta wersja działa zgodnie z oczekiwaniem pod Delphi. K.

Dnia 2013-11-15 John Smith dokonal ponizszego cudu (by zylo sie lepiej):

Co, g³upio ci, ¿e chcia³e¶ siê wym±drzyæ, a wyszed³e¶ na ... :P

Tak siê sk³ada, ¿e parê latek siê pracuje jako programista, a tak banalne rzeczy to nawet uczniowie w liceum informatycznym wiedz± :P

Pzdr. Marek

U¿ytkownik "Jakub Rakus" napisa³ w wiadomo¶ci news:l65q9f$ett$ snipped-for-privacy@node1.news.atman.pl...

Zignorowa³e¶ moje pytanie dotycz±ce poprawno¶ci wy¶wietlania w StringGridzie w zale¿no¶ci od tre¶ci ³añcucha (czy zawiera polskie znaki), ale choæ nie mam du¿ego do¶wiadczenia w pisaniu pod Lazarusem, to przypuszczam, ¿e problem mo¿e byæ zwi±zany z kodowaniem znaków w tym ¶rodowisku, tzn. UTF-8. W zwi±zku z tym spróbuj zrobiæ co¶ takiego:

Var genotyp: string[8];

genotyp := Utf8ToAnsi('mówiæco¶'); //oczywi¶cie tekst max 8 znaków

StringGrid1.Cells[2,3] := AnsiToUtf8(genotyp);

Czy ten tekst wy¶wietla siê w StringGridzie?

Pzdr. Marek

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required