Kolejny konkurs dla Delphi lub BCB [tym razem wizualny]

0

Heh.. kolejny konkurs... Tym razem aspekt wizualny, a problem trudny. Konkurs Kończy się 16 lutego o godziniue 20.30, wygrywa kod który bedzie zoptymalizowany i spełniał wszystkie warunki działania, a wszystko powinno się mieścić w Jednej, góra dwóch procedurach(w ramach jednej procedury można używać pseudokodu, jak ktoś chce). w konkursie może brac udział każdy, kto może wypić piwo (jedno lub więcej) i zrozumie warunki działania oczekiwane od kodu. A o to zadanie:

Jest sobie ListView z ViewStyle ustawionym na vsReport, mający 3 kolumny.
Pierwsza kolumna to: 1 checkbox, 1 ikonka 16x16 i text UPCASE do 4 liter.
Druga to sam text, ale długi.
Trzecia to też text, ale raczej krótki...

i teraz sandardowo kolumny powinny wyglądać tak po pokazaniu okienka:

Pierwsza powinna być widoczna w całości, druga też, a trzecia też, z tym że jeżeli w drugiej text się nie mieści to trzecia powinna zmniejszyć się, ale nie wiecej niż o polowe swojej szerokości, a wszystkie mają sie mieścić w szerokości ListViewa

Teraz, ponieważ okienko z listviewem może być resizowane kolumny powinny dopasowywać do szerokości listviewa, w ten oto sposób:

Gdy szerokość maleje:
Pierwsza kolumna nie zmienia swojej szerokości, trzecia zmniejsza, dopóki nie osiągnie połowy długości najdłuższego textu, a druga, gdy już zmniejszy się trzecia zmniejsza się do 0. gdy druga osiągnie 0 zablokowac należy zmniejszanie okna

Gdy szerokość rośnie:
Pierwsza się nie zmienia, druga rośnie, dpoóki nie osiągnie całej długości najdłuższego textu, następnie rośnie trzecia aż do osiągnięcia całej długości najdłuższego textu, a potem już rośnie szerokość drugiej.

Kolejny bajer: kolumny mogą być resizowane przez użytkownika, tylko że pierwsza nie zmienia nigdy swojej szerokości, druga ma nieograniczoną możliwość zmiany, a trzecia minimalna szerokość to długość połowy najdłuższego textu. Ponieważ okno można resizować szerokości kolumn muszą zmieniać się proporcjonalnie.

Ciekawe, co? Nagroda za poprawne rozwiązanie: [browar] lub [soczek] dowolnie wybranej marki. Nagrodzony zostaje kod najbardziej optymalny i spełniający wszystkie warunki działania, oraz mogący być zaadaptowany do różnych warunków.

Powodzenia [cya]

//hehe, dryo troche nie przeczytał, ale to nic, może inni bedą czytać dokładnie...

Dodatkowe uwagi:
0. Wszystkie itemy są tworzone dynamicznie...

  1. Nie sugerować się długością textu w znakach, bo IIII jest węższe od WWW mimo iż ma więcej znaków (a statycznie zgodnie z warunkami nie da się ustawić).
  2. Mozna pisać też w BCB, mi to nie robi problemu, bo jako tako kumam C++
  3. Czytać dokładnie zadanie! a jak ktoś potrzebuje template form (żeby zajarzyć jakie są itemy w listviewku), to mogę wyprodukować, ale tylko dla delphi lub BCB
0

Szczerze mowiac malo programistyczne zadanie. Jezeli ma byc 1 procedura, a mozna ustawiac wlasciwosci wczesniej (nie koniecznie dynamicznie), to takie cos od razu nam Delphi zapewnia (w duzym stopniu).
Ciesze sie, ze stale ktos probuje jakies konkursy wprowadzic. Szkoda, ze na razie sa one zbytnio ograniczane. Tzn. albo ogranicza sie platforma systemowa, albo srodowiskiem programistycznym. Przydalyby sie konkursy zaczynajace od bardzo prostych zadan tak, by mogli w nich wziac udzial poczatkujacy i zeby to byly zadania programistyczne, a nie na zasadzie "jak umiescic button na formie" :)
Konkurs Vogel'a spelnia zadanie "programistycznego". Twoj "dla poczatkujacych". Ale przydaloby sie je polaczyc...

0

Konkurs Vogel'a spelnia zadanie "programistycznego". Twoj "dla poczatkujacych". Ale przydaloby sie je polaczyc...

A ja np. nie lubie, ze wiekszosc konkursow informatycznych zaweza sie do matematycznego rozumowania, algorytmow itp. i dlatego ucieszylo mnie, ze ktos tym razem chcial "wylansowac" cos nowego.

Chociaz kiedys dosc czesto obserwowalem na zachodnich serwisach konkursy w php i zagadnienia byly naprawde ciekawe (dodatkowo z rzeczy, ktorych sie w tym jezyku raczej nie robi) - np. gra, w ktorej twoj skrypt musi wygrac ze skryptem przeciwnika itp.

0

ech, jak widze nikomu nie udało sie rozwikłac problemu w zadanym czasie. problem zostaje, konkurs trwa dalej, az wreszcie ktoś się znajdzie, kto potrafi to zrobic (jak się wam uda wszystkie warunki to możecie na siebie mówić per master)

//założe się ze nikt w ciągu nawet miesiąca tego nie zrobi, to jest za trudne, nawet na experts-exchange nichuchu... ale.. może jest jakieś światełko w tunelu...

0

Konkurs Vogel'a spelnia zadanie "programistycznego". Twoj "dla poczatkujacych". Ale przydaloby sie je polaczyc...

Niech w tym ListView'ie pojawi się rozwiązanie mojego problemu :)

0

dryo przesłał taki kod:

procedure TForm1.ListView1Resize(Sender: TObject);
var
  R1: TRect;
  MaxDl1,
  MaxDl2,
  MaxDl3,
  Dl1,
  Dl2,
  Dl3,
  i: Integer;
begin
  MaxDl1 := 0;
  MaxDl2 := 0;
  MaxDl3 := 0;
  with ListView1 do
    for i := 0 to Items.Count-1 do
    begin
      Dl1 := Canvas.TextWidth('wwww'+Items[i].Caption)+32;
      if Dl1 > MaxDl1 then
        MaxDl1 := Dl1;
      Dl2 := Canvas.TextWidth('wwww'+Items[i].SubItems.Strings[0]);
      if Dl2 > MaxDl2 then
        MaxDl2 := Dl2;
      Dl3 := Canvas.TextWidth('wwww'+Items[i].SubItems.Strings[1]);
      if Dl3 > MaxDl3 then
        MaxDl3 := Dl3;
    end;

  ListView1.Column[0].Width := MaxDl1;
  ListView1.Column[0].MinWidth := MaxDl1;
  ListView1.Column[0].MaxWidth := MaxDl1;

  if ListView1.Width-MaxDl1-MaxDl3 div 2 < 0 then
  begin
    ListView1.Column[1].Width := 0;
    ListView1.Column[2].Width := MaxDl3 div 2;
    ListView1.Width := MaxDl1+MaxDl3 div 2;
    Exit;
  end;

  if MaxDl1+MaxDl2+MaxDl3 < ListView1.Width then
  begin
    ListView1.Column[1].Width := MaxDl2;
    ListView1.Column[2].Width := ListView1.Width-MaxDl1-MaxDl2;
  end
  else if MaxDl1+MaxDl2+MaxDl3 div 2 < ListView1.Width then
  begin
    ListView1.Column[1].Width := MaxDl2;
    ListView1.Column[2].Width := ListView1.Width-MaxDl1-MaxDl2;
  end
  else
  begin
    ListView1.Column[1].Width := ListView1.Width-MaxDl1-MaxDl3 div 2;
    ListView1.Column[2].Width := MaxDl3 div 2;
  end;
end;

To jest dobry kod, ale... Scrollbar dość często się pojawia, 1 kolumna nie spełnia warunków (można ją resizowac, i nie jest perfekcyjnie text wpasowany) reszty niedointerpretowania warunków nie bedę omawiał, ale kod już idzie w bardzo dobra stronę... tylko żeby spełniał wszystkie warunki...

Dobra, na razie testowanie tylko na WinXP SP1 theme Resonance Hyper 2.
na tym będą testowane też inne prace, jak bedzie działać idealne na tej konfiguracji sprawdzę na linuxie (wine) i na windowsie 98

0

Pierwsza mozna resizowac? U mnie nie :( Tzn. wraca automatycznie do swoich rozmiarow.
Co do scrollbara to niedoczytalem :P
Problem jest z wymierzeniem rozmiaru tekstu. TextWidth nie zwraca rzeczywistej wartosci :( ListView dorzuca jakies wlasne stale. Testowalem przy zwyklej czcionce i typu bold i okazywalo sie, ze rozny rozmiar zajmuja, a algorytm wyliczania jest bledny. Dlatego tez jest tam 'wwww' w celu wyrownania. Mozna jeszcze wiecej dorzucic, jezeli by nie pasowalo, ale wtedy przy zwyklym tekscie glupio to wyglada :( Nie podoba mi sie ten ListView. Strasznie zabuggowany (nawet jak na produkt M$ :P)

0

wiem, i w tym tkwi sedno sprawy...

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