ListBox jak w GG

LU
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 13 lat
0

troche mi się nudziło w domu, więc napisałem na podstawie tych informacji komponent oparty na ListBox.
nie testowałem obsługi zdarzeń ale chyba działa
oto kod:

Kopiuj
{
  GGList
  Licencja: Brak
  Uwagi:
    Rób z tym co chcesz :-)
}

unit GGList;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, ComCtrls, Graphics, Windows, Forms;

const
  DefColor = $00F2FEEC;
  DefSelColor = $009DDEB7;
  DefSelFrameColor = $00266042;

type
  TCustomGGList = class(TListBox)
  private
    FIcons: TImageList;
    FListView: TListView;
    FSelColor: TColor;
    FSelFrameColor: TColor;
    FShowStatus: Boolean;
    procedure FOnResize(Sender: TObject);
    { Private declarations }
  protected
    procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;
    procedure MeasureItem(Index: Integer; var Height: Integer); override;
    procedure SetSelFrameColor(Value: TColor);
    procedure SetSelColor(Value: TColor);
    procedure SetListView(Value: TListView);
    procedure SetIcons(Value: TImageList);
    procedure SetShowStatus(Value: Boolean);

    property ShowStatus: Boolean read FShowStatus write SetShowStatus;
    property ListView: TListView read FListView write SetListView;
    property Icons: TImageList read FIcons write SetIcons;
    property SelColor: TColor read FSelColor write SetSelColor default DefSelColor;
    property SelFrameColor: TColor read FSelFrameColor write SetSelFrameColor default DefSelFrameColor;
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    { Public declarations }
  published
    procedure RefreshItems;
    { Published declarations }
  end;

type
  TGGList = class(TCustomGGList)
  published
    property Icons;
    property ItemIndex;
    property ListView;
    property SelColor;
    property SelFrameColor;
    property ShowStatus;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Moje komponenty', [TGGList]);
end;

{ TGGList }

constructor TCustomGGList.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Style := lbOwnerDrawVariable;
  Color := $00F2FEEC;
  SetSelColor($009DDEB7);
  SetSelFrameColor($00266042);
  SetShowStatus(True);
  OnResize := FOnResize;
end;

procedure TCustomGGList.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
var
  Ico: TIcon;
  X, H: integer;
  S, T: string;
  I: integer;
  R: TRect;
  Row: integer;
  Z: integer;
begin
  inherited;
  Ico := TIcon.Create;
  if odSelected in State then
  begin
    R.Left := Rect.Left + 1;
    R.Right := Rect.Right - 1;
    R.Top := Rect.Top + 1;
    R.Bottom := Rect.Bottom - 1;
    Canvas.Brush.Color := FSelColor;
    Canvas.FillRect(R);
    Canvas.Brush.Color := FSelFrameColor;
    Canvas.FrameRect(R);
    Canvas.Brush.Style := bsClear;
    if Assigned(FIcons) then
    begin
      FIcons.GetIcon(0, Ico);
      Canvas.Draw(Rect.Right - 30, Rect.Top + 4, Ico);
      if FShowStatus then
      begin
        FIcons.GetIcon(StrToInt(FListView.Items[Index].SubItems[3]), Ico);
        Canvas.Draw(Rect.Left + 4, Rect.Top + 4, Ico);
      end;
    end;
    Canvas.Font.Color  := clBlack;
    Canvas.Font.Style  := [fsBold];
    Canvas.TextOut(Rect.Left + 25, Rect.Top + 6, FListView.Items[Index].SubItems[0]);
  end
  else
  begin
    Canvas.Brush.Color := Color;
    Canvas.FillRect(Rect);
    if Assigned(FIcons) then
    begin
      FIcons.GetIcon(0, Ico);
      Canvas.Draw(Rect.Right - 30, Rect.Top + 4, Ico);
      if ShowStatus then
      begin
        FIcons.GetIcon(StrToInt(FListView.Items[Index].SubItems[3]), Ico);
        Canvas.Draw(Rect.Left + 4, Rect.Top + 4, Ico);
      end;
    end;
    Canvas.Font.Color  := clBlack;
    Canvas.Font.Style  := [fsBold];
    Canvas.TextOut(Rect.Left + 25, Rect.Top + 6, FListView.Items[Index].SubItems[0]);
  end;
  Ico.Free;
  Canvas.Font.Name := 'Tahoma';
  Canvas.Font.Height := -10;
  Canvas.Font.Style := [];

  H := Canvas.TextHeight(FListView.Items[Index].Caption);
  S := FListView.Items[Index].SubItems[2];
  Row := (Canvas.TextWidth(S)) div (Width - 20);
  if (Row * (Width - 20)) <> Canvas.TextWidth(S) then
    Row := Row + 1;

  for i := 1 to Row do
  begin
    for x := 1 to Length(S) do
    begin
      if x = Length(S) then
      begin
        Canvas.TextOut(Rect.Left + 10, (Rect.Top + H) + (10 * i),  Copy(S, 1, X));
        Break;
      end;
      if S[x] = ' ' then
      begin
        T := Copy(S, 1, X);
        if Canvas.TextWidth(T) < Width - 20 then
          Z := X
        else
          Break;
      end;
    end;
    Canvas.TextOut(Rect.Left + 10, (Rect.Top + H) + (10 * i),  Copy(S, 1, Z));
    Delete(S, 1, Z);
  end;
end;

procedure TCustomGGList.MeasureItem(Index: Integer; var Height: Integer);
var
  S: string;
  Row: integer;
begin
  inherited;
  try
     S := FListView.Items[Index].SubItems[2];
    Row := (Canvas.TextWidth(S)) div (Width - 20);
    if (Row * (Width - 20)) <> Canvas.TextWidth(S) then
      Row := Row + 1;
    if Row > 0 then
      Height := (28 + 6) + (10 * Row)
    else
      Height := 28;
  except
  end;
end;

procedure TCustomGGList.FOnResize(Sender: TObject);
begin
  Repaint;
end;

procedure TCustomGGList.SetListView(Value: TListView);
begin
  FListView := Value;
  RefreshItems;
end;

procedure TCustomGGList.SetSelColor(Value: TColor);
begin
  FSelColor := Value;
  Repaint;
end;

procedure TCustomGGList.SetSelFrameColor(Value: TColor);
begin
  FSelFrameColor := Value;
  Repaint;
end;

procedure TCustomGGList.SetIcons(Value: TImageList);
begin
  FIcons := Value;
  Repaint;
end;

procedure TCustomGGList.SetShowStatus(Value: Boolean);
begin
  FShowStatus := Value;
  Repaint;
end;

procedure TCustomGGList.RefreshItems;
var
  i: integer;
begin
  Clear;
  for i := 0 to FListView.Items.Count - 1 do
    Items.Add(FListView.Items[i].Caption);
  Repaint;
end;

end.
lukasz1235
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 8 lat
  • Postów:1105
0

A jak załadować do tego komponentu listę kontaktów?

0
lukasz1235 napisał(a)

A jak załadować do tego komponentu listę kontaktów?

poprzez zewnętrzny komponent ListView. Najlepiej dodac do OnChange komponentu ListView coś takiego:

Kopiuj
GGList1.RefreshItems;

listview musi miec 5 kolumn:

  • Numer GG,
  • Nazwa,
  • Adres IP,
  • Opis,
  • Status

Status to nr obrazka statusu w komponencie imagelist</delphi>

lukasz1235
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 8 lat
  • Postów:1105
0

A ktoś może dać source, bo nie mogę sobie dać rady :/

cjv
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 14 lat
  • Postów:16
0
Kopiuj
procedure TForm1.FormCreate(Sender: TObject);
 var
 i:integer;
 Item: TListItem;
begin

 for i:=0 to l1.Items.Count -1 do
begin
LUser.Items.Add(L1.Items[0].SubItems[0]);

end;
end;

P.S Pod warunkiem że do L1 są dodane dane..;]


ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

Witam

Nie umiem dodawać nowych pozycji do tego komponentu...
Mógłby mi ktoś podać co trzeba wpisać pomiędzy

Kopiuj
procedure TForm1.Button1Click(Sender: TObject);
begin

end;

Pozdrawiam
Stylap

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Dodajesz najpierw do ListView skojarzonego z GGList ListItem, a później wywołujesz procedurę RefreshItems;

Kopiuj
var
  ListItem : TListITem;
begin
  ListItem := ListView1.Items.Add;
  ListItem.Caption := 'Numer GG';
  ListITem.SubItems.Add('Nazwa');
  ListITem.SubItems.Add('Adres IP');
  ListITem.SubItems.Add('Opis');
  ListITem.SubItems.Add('0');
  GGList.Icons := ImageList1;
  GGList.ShowStatus := True;
  GGList.ListView := ListView1;
  GGList.RefreshItems;
end;

Ale polecam sobie przerobić ten komponent tak, jak pokazałem na: http://pastebin.pl/17203 wtedy dodać w
ListView wystarczy dodać nazwę, numer, opis oraz - jako tekst - cyfrę oznaczającą numer ikony w ImageList.


Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0
olesio napisał(a)

Dodajesz najpierw do ListView skojarzonego z GGList ListItem, a później wywołujesz procedurę RefreshItems;

Kopiuj
var
  ListItem : TListITem;
begin
  ListItem := ListView1.Items.Add;
  ListItem.Caption := 'Numer GG';
  ListITem.SubItems.Add('Nazwa');
  ListITem.SubItems.Add('Adres IP');
  ListITem.SubItems.Add('Opis');
  ListITem.SubItems.Add('0');
  GGList.Icons := ImageList1;
  GGList.ShowStatus := True;
  GGList.ListView := ListView1;
  GGList.RefreshItems;
end;

Ale polecam sobie przerobić ten komponent tak, jak pokazałem na: http://pastebin.pl/17203 wtedy dodać w
ListView wystarczy dodać nazwę, numer, opis oraz - jako tekst - cyfrę oznaczającą numer ikony w ImageList.

wielkie dzięki! Pomogło [soczek]

Tylko teraz jak sprawić by Lista sie aktualizowała?
Wiem dla jakiego zdarzenia to zrobic ale... jak to zrobic by odswiezyc status i opis kazdej osoby z listy kontaktow?

Korzystam z EasyGG i zdarzenia OnUserStatus.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Ja też napisałem sobie komunikator jako tako działający oparty na TEasyGG, jednak póki wykrzacza mi się w
momencie importu niektórych numerów z pliku, a poza tym są w nim jeszcze inne błędy to czekam aż autor
wypuści nową wersję z poprawionymi błędami i z tego co wiem - umożliwiającą importowanie kontaktów też
z serwera gg. Co do odświeżenia listy kontaktów, to masz przecież demo dołączone do TEasyGG i tam jest to
dokładnie pokazane. Ja robię tak jak poniżej. Mam dynamicznie utworzone zarówno TEasyGG jak i GGList, no
i sam ListView do niego "podpięty". Tylko, że ja nieco przerobiłem ten TGGList, tak jak podałem Tobie w tym
linku wcześniej i dlatego u mnie dane są w innych kolumnach, ale odświeżanie mam zrobione w taki spsoób,
bo ja opis przechowuję w kolumnie Subitem 1 (czyli trzecia), zaś cyfrę statusu w Subitem 2 (czyli czwarta).
Po prostu u mnie użytkownicy są dodani jako obiekty do LiistView, jednak u siebie jeżeli przechowuje ich, w
nazwijmy to - tylko postaci tekstowej, to zamiast ...Data - robisz pętlę po samych ListView.Items.Item[I]...

Kopiuj
//...
function StateID(Status : TUserStatus) : Byte; overload;
// ...
implementation
//...
function StateID(Status : TUserStatus) : Byte;
begin
  case Status of
    usAvailable : Result := 0; // Dostępny
    usBusy : Result := 1; // Zaraz wracam
    usNotAvailable : Result := 2; // Niedostępny
    usInvisible : Result := 3; //Niewidoczny
    usBlocked : Result := 4; //Zablokowany
  else
    Result := 1; // Niedostępny
  end;
end;
// ...
procedure TMainForm.UserStatus(Sender : TObject; User : TUser);
var
  I : Integer;
begin
  for I := 0 to ContactsLV.Items.Count - 1 do
  begin
    if ContactsLV.Items.Item[I].Data = User then
    begin
      ContactsLV.Items.Item[I].Caption := User.Name;
      ContactsLV.Items.Item[I].SubItems[1] := User.Description;
      ContactsLV.Items.Item[I].SubItems[2] := IntToStr(StateID(User.Status));
    end;
  end;
  ContactsLV.AlphaSort;
  GGL.RefreshItems;
end;

Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

moge Cie prosić o kontakt? Dopóki nie zacząłem używać GGLIst wszystko działało...

teraz mi sie krzaczy nawet usunięcie usera..

GG: 4183818.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Ja używam w swoim programie GGList i nic się nie krzaczy. Tylko że ja mam zrobiony kod w taki sposób
że kiedy zaznacze element lub elementy na GGList kliknięciem - to takie same elementy zaznaczają się
na ContactsLV, który jest dynamicznie utworzonym ListViewem. Mój kod poniżej. Pokaż swój i napisz w
ogóle jakie się Tobie błędy pokazują. Jak usuniesz elementy z ListView podłączonego do GGList i potem
odświeżysz GGList przy użyciu RefreshItems; to wszystko powinno być w porządku. Nie podeśle Tobie
póki co mojego komunikatora, bo nie jest jeszcze skończony i nie jest uniwersalny. Zawiesiłęm póki co
nad nim pracę, bo czekam aż pewien błąd będzie poprawiony w TEasyGG, program jest w fazie testów
dlatego pokaż swoj kod to cos się z nim pomyśli co poprawić, o ile dojdę co Ty robisz nie tak u siebie ;/

Kopiuj
procedure TMainForm.GGL_Click(Sender : TObject);
var
  I : integer;
  LB : TListBox;
begin
  LB := TGGList(Sender);
  for I := 0 to LB.Items.Count - 1 do
  begin
    if LB.Selected[I] = True then
    begin
      ContactsLV.Items.Item[I].Selected := True;
    end
    else
    begin
      ContactsLV.Items.Item[I].Selected := False;
    end;
  end;
end;

Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0
olesio napisał(a)

(...)kiedy zaznacze element lub elementy na GGList kliknięciem - to takie same elementy zaznaczają się
na ContactsLV, który jest dynamicznie utworzonym ListViewem...

Kopiuj
procedure TMainForm.GGL_Click(Sender : TObject);
var
  I : integer;
  LB : TListBox;
begin
  LB := TGGList(Sender);
  for I := 0 to LB.Items.Count - 1 do
  begin
    if LB.Selected[I] = True then
    begin
      ContactsLV.Items.Item[I].Selected := True;
    end
    else
    begin
      ContactsLV.Items.Item[I].Selected := False;
    end;
  end;
end;

W tym chyba cały sekret polega. Próbowałem operować na GGList, zamiast na listview...

Kopiuj
  for i := GGList1.Items.Count-1 downto 0 do
    if GGList1.Selected[i]=true then begin
    User := TUser(GGList1.Items.Objects[i]);
    GGList1.Items.Delete(i);
    easygg1.DeleteUserByID(User.UID);
    end;

Mniej więcej tak jak to wyglądało w demku. Teraz widzę swój błąd i chyba właśnie wysłałeś mi rozwiązanie. Zaraz sprawdzę.

Pozdrawiam
Stylap

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

No to chyba problem rozwiązany, musisz operować na ListView podczepionym do GGList i z niego usuwać to,
co potrzrebne, a później tylko ten GGList odświeżać przy użyciu RefreshItems - a on odczyta dane z ListView.


Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

ach zapomnial bym...
taki błąd wyskakuje:
"Undeclared identifier: 'objects'"
w 4 linijce od góry

Kopiuj
  for i := Listview1.Items.Count-1 downto 0 do
    if ListView1.Items.Item[i].Selected=true then
    begin
      User := TUser(ListView1.Items.Objects[i]);
      ListView1.Items.Delete(i);
      easygg1.DeleteUserByID(User.UID);
      GGList1.RefreshItems;
    end;
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Źle kombinujess, ListView nie ma własności Objects tylko Data - na przykład:

Kopiuj
ContactsLV.Items.Item[I].Data

Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

ok wielkie dzięki. drobne kosmetyczne zmiany i znów zaczęło działać.

jak na razie szwankują mi dynamiczne okienka i niestety nie mogę znaleźć prawidłowej metody wysyłania wiadomości tekstowej zawierającej pogrubienia itp.

Pozdrawiam
stylap

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

W tym niebardzo mogę pomóc, bo ja w swojej wersji komunikatora założyłem tylko otrzymywanie oraz
wysyłanie PlainTextu. Tak jak kiedyś Netykieta Usenetu i nie tylko mówiła że nie wysyła się e-maili ani
postów w HTMLu, tak samo nie powinno się wysyłać upstrokaconych kolorami i pogrubieniem tekstów.


Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

Oczywiście netykieta netykietą po prostu robię program sam dla siebie, to tak żeby po wieloletniej przerwie poprzypominać sobie delphi.

Czy uporałeś się z otwieraniem dynamicznych okienek? Na http://4programmers.net/Delphi/Gotowce/Dynamiczne_okienka_jak_te_z_GGznalazłem dwie metody obie działają.

Różnią się jedynie wyszukiwaniem odpowiedniego okienka:
Jedna najprostsza metoda polega na wyszukiwaniu okienek po Caption. której nie polecam.

Druga metoda bazuje na wpisywaniu dla każdego dynamicznego okienka wartości TAG może być np. numer gg użytkownika. Tej metody nie sprawdziłem.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Tak, okienka dynamicznie działają u mnie ok, co wynikało z pobieżnych testów z InfoBotem ale nie tylko.
Zobacz na mój kod w temacie http://4programmers.net/Forum/601788 tam jest kod w
moim wykonaniu. Do przechowywania numeru użyłem zmiennej LongWord będącej w sekcji public klasy
okienka ChatWindow. Można użyć do tego celu Taga, lecz należy mieć na uwadze to, że Tag to wartość
typu integer, a UID to LongWord, a więc bez ujemnych i nieco więcej chyba niż integet gdy chodzi o jego
maksymalną wartość. Przy tworzeniu dynamicznym formatki dodaję do jej nazwy również numer UID po
znaku podkreślenia, a później operuję na FindComponent. Zresztą zobacz kod z tematu o linku powyżej,
jest tam także gotowy wycinek pliku dfm, tak abyś wiedział jak to u mnie wygląda cała klasa formatki.


Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0
olesio napisał(a)

Tak, okienka dynamicznie działają u mnie ok, co wynikało z pobieżnych testów z InfoBotem ale nie tylko.
Zobacz na mój kod w temacie http://4programmers.net/Forum/601788 tam jest kod w
moim wykonaniu. Do przechowywania numeru użyłem zmiennej LongWord będącej w sekcji public klasy
okienka ChatWindow. Można użyć do tego celu Taga, lecz należy mieć na uwadze to, że Tag to wartość
typu integer, a UID to LongWord, a więc bez ujemnych i nieco więcej chyba niż integet gdy chodzi o jego
maksymalną wartość. Przy tworzeniu dynamicznym formatki dodaję do jej nazwy również numer UID po
znaku podkreślenia, a później operuję na FindComponent. Zresztą zobacz kod z tematu o linku powyżej,
jest tam także gotowy wycinek pliku dfm, tak abyś wiedział jak to u mnie wygląda cała klasa formatki.

kompletnie nie rozumiem tego co tam wstawiłeś. przydały by się komentarze po prostu nie wiem jak to dostosować do tego co jest u mnie.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

A czego konkretnie nie rozumiesz? Zmienna są z angielska, kod jest sformatowany programem tak aby to
było jak najbardziej czytelne według mnie. Myślałem, że to się Tobie do czegoś przyda. Bo jeżeli chodzi
o zrzut plików chat.pas oraz formatki chat.dfm to można po podpięciu do projektu to używać, ale jak z
tym nie chcesz się bawić - to nie namawiam. Ale masz tam przykład jak rozwiązać sprawdzenie czy już
formatka z oknem rozmowy dla danego numeru istnieje i jeżeli nie to ją tworzyć, a jak nie to pokazać.
Przy okazji - wczoraj wyszła wersja 0.2 TEasyGG ma wsparcie dla importu oraz eksportu kontaktów
z/do serwera oraz z/do plików xml. Zmieniono nieco obsługę userów. Poprawiono także chyba pewne
inne błędy, które wywalały wyjątki przy imporcie listy kontaktów z pliku txt w starym formacie - moją
metodą, bo ja jeżeli już używam sporadycznie GG do czytania wiadomości - to używam wersji 7.6.0.


Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

no tak wszystko się rozbija o to ze w Delphi 7 Personal nie posiadam komponentu XMLDocument.

Właśnie nie rozumiem metod wyszukiwania danego okna przez Ciebie... właśnie w tym miejscu mi się krzaczy...

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

No niestety, odpisałem Tobie już w osobnym wątku, ktory założyłeś, że autor może za moją namową w 0.3
wersji TEasyGG skorzysta z zewnętrznego parsera XML. Póki co sprawdź swojego maila, napisałem w nim Ci
jak rozwiązaĆ tymczasowo problem z brakiem modułów do XMLa. A co do mojej metody obsługi formatki do
rozmowy, to poczytaj http://pl.wikibooks.org/wiki/Delphi/Dynamiczne_tworzenie_komponentów tam masz
informację jak działa funkcja FindComponent. Po prostu mój kod działa tak, że jeżeli nie ma stworzonej dla
danego rozmówcy jeszcze okna to je tworzy dynamicznie używając stworzonego szablonu formatki, a jeżeli
okno takie jest już stworzone - to pokazuje ikonę w Trayu lub jeśli okno jest zminimalizowane miga "belką".


Pozdrawiam.
ST
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 12 lat
0

ok wielkie dzięki. Powiedz mi tylko co z tą funkcją chatwindowlist jak ona powinna wyglądać. Występuje w evencie odebrania wiadomosci.

Pozdrawiam
stylap

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Odpisałem Tobie na maila i wkleiłem nieco kodu oraz wyjaśniłem. Jak jeszcze masz jakieś wątpliowści to
możesz napisać tutaj albo na emaila. Jednak wydaje mi się, że jasniej nie potrafię wytłumaczyć co i jak.


Pozdrawiam.
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
0

Chyba zapomniałem się pochwalić. Ale udało mi się wtedy znaleźć komponent, który spełniał wszystkie moje potrzeby. Nazywa się z tego co pamiętam TUsersListBox albo jakoś tak i znalazłem go CHYBA na torrym. Bardzo łatwy w obsłudze, przyjemny i ma wszystko, co trzeba.

Tylko trzeba pamiętać, że po niektórych operacjach należy go odświeżyć(Refresh).

Piotruch88
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 13 lat
0
Bejo napisał(a)
puchi napisał(a)

Kiedyś coś takiego pisałem z nudy. Do rysowania listy używałem ListBoxa a dane kontaktów (numer, nazwa, opis itp) trzymałem w ListView

Jak możesz wyślij źródła: tymczasowe15@wp.pl bo nie mogę tego poprawnie skompilować, wyrzuca mi błąd "ListIndex out of bounds (2)".

Ja też mam taką gorącą bardzo prośbę o wysłanie źródełek na e-mail :-)
Groch z kapustą tutaj totalny i już 1,5 godziny to ogarniam i ni chu**

piotruch88@yahoo.pl

Z góry dzięki

Edit:
OK już sobie z tym poradziłem. Jak coś to służę pomocą.

LE
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 3 lata
  • Postów:232
0

Siemano, ten temat to kawał dobrej roboty i wiele porad;) ale czy ktoś mógłby mi poradzić w jaki sposób w listbox nie wyświetlać tej kropkowanej otoczki jak zaznacza się wartość? :) gdzieś to widzialem na internecie ale za cholere nie umiem <ort>znaleŹć</ort>:(

POZDRO!

puchi
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Postów:411
1

Legalnl na końcu procedury OnDrawItem daj:

Kopiuj
if odFocused in State then ListBox.Canvas.DrawFocusRect(Rect);

pamietaj dopieo pow wykonaniu wszystkich operacji rysowania!!!

LE
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 3 lata
  • Postów:232
0

Tak myslałem ze coś zfocus. niektóre komponenty mają to w object inspektor :D Dzieki wielkie za porade ;)

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)