Dá se listbox1.items zpracovat cyklem? Záměna slov. – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dá se listbox1.items zpracovat cyklem? Záměna slov. – Delphi – Fórum – Programujte.comDá se listbox1.items zpracovat cyklem? Záměna slov. – Delphi – Fórum – Programujte.com

 

oxidián0
Grafoman
27. 5. 2017   #1
-
0
-

Něco jako toto?

for item in listbox1.items do
    begin
      item := stringreplace(listbox1.items, '; locked','zamknuto', [rfReplaceAll]);
      item := stringreplace(listbox1.items, '; lock','zamknuto', [rfReplaceAll]);
    end;

Dostávám hlášku že item není definovaná, dá se deklarovat? jako že bych spíš chtěl přistupovat k tomu ve smyslu listbox1.items[currentIndex] ...

Prostě chci zaměnit slovo lock nebo locked na konci za zamknuto. Jenže dělat to pomocí ListBox.indexOd mi přijde neohrabané a nešikovné, protože já nehledám žádný konkrétní řádek. Chci prostě jen zaměnit dvě slova v celém seznamu.
 

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #2
-
0
-

#1 oxidián
no tohle ti fungovat nemůže.ten item nefunguje protože ho nemáš definovanej Var item :string;, ale ani tak ti to nepůjde.

a ani ta náhrada ti takhle přímo nepůjde 

for I = 0 to listbox1.items.count-1 do
    begin
      listbox1.items[I] := stringreplace(listbox1.items[I], '; locked','; zamknuto', [rfReplaceAll]);
      listbox1.items[I] := stringreplace(listbox1.items[I], '; lock','; zamknuto', [rfReplaceAll]);
    end;


funguje odzkoušeno, jinak pokud to v hledaném textu máš i se středníkem měl bys ten středník mít snad i v náhradě ne?

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #3
-
0
-

Mě to nejede a hlásí mi to chyby. For loop control variable must be simple local variable...

function TBooksDialog.replaceListItems: string;
var i: integer;
begin
for i = 0 to listbox1.items.count-1 do
  begin
    listbox1.items[i] := stringreplace(listbox1.items[i], '; locked','; zamknuto', [rfReplaceAll]);
    listbox1.items[i] := stringreplace(listbox1.items[i], '; lock','; zamknuto', [rfReplaceAll]);
  end;
end;


V7

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #4
-
0
-

#3 oxidián
chybí ti tam v tom foru : před =

a nevím proč to máš jako funkci z tohohle není třeba nic vracet. spíš bych si tu funkci z univerzálnil

// definice
procedure ReplaceInListBoxItems(var list: TListBox;co, cim :string);overload;
procedure ReplaceInListBoxItems(var list: TListBox;co, cim :string;flags : TReplaceFlags); overload;
procedure ReplaceInListBoxItems(var list: TListBox;cocim : array of string); overload;    // co čím je pole stringů střídavě co,čím,co,čím, měl by být sudá počet, aby byly spárované
procedure ReplaceInListBoxItems(var list: TListBox;cocim : array of string;flags : TReplaceFlags); overload;


// příklady volání
ReplaceInListBoxItems(listbox1,'nice','Nice');    //volá proceduru se stringy
ReplaceInListBoxItems(listbox1,['nice','Nice']);  //´volá proc se str array

// implementace
procedure ReplaceInListBoxItems(var list: TListBox;co, cim :string);
begin
  ReplaceInListBoxItems(list,[co, cim],[rfReplaceAll]);
end;

procedure ReplaceInListBoxItems(var list: TListBox;co, cim :string;flags : TReplaceFlags)
begin
  ReplaceInListBoxItems(list,[co, cim],flags);
end;

procedure ReplaceInListBoxItems(var list: TListBox;cocim : array of string);
begin
  ReplaceInListBoxItems(list,cocim,[rfReplaceAll]);
end;

procedure ReplaceInListBoxItems(var list: TListBox;cocim : array of string;flags : TReplaceFlags);
var
  I,J,zamen : integer;
begin
  zamen := length(cocim);
  // kontroly, Flags by měl být ověřen při překladu
  if zamen = 0 then exit;          // pole zamen je prázdné
  if (zamen mod 2) >0 then exit;   // stringy co-čím nejsou spárované
  if (list=nil) or (list.Items.count=0) then exit;	//není vytvořen objekt Listbox, nebo neobsahuje položky
  
//smyčka Items
  for I := 0 to list.Count-1 do
  begin
    J := 0;      // J = čítač záměn
    while J<zamen do
    begin
      list.Items[I] := stringreplace(list.Items[I], cocim[J], cocim[J+1], [rfReplaceAll]);
      inc(J,2);
    end;
  end;
end;

Na tyhle věci mám vlastní knihovnu funkcí, od D2010 fungují tzn helpery pak by bylo volání jednodušší listbox1.replaceInItems.

podle toho jak to funguje, lze mít náhrady i serializované takže třeba druhý pár náhrad může být na nový stav z 1. náhrady + něco navíc např ['No.=','číslo=','číslo=10;','číslo=0010;'] nejdříve se proběhne první náhrada za No. se dá číslo a v druhé náhradě se pak číslo=10 nahradí číslo=0010.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #5
-
0
-

Tak jak ti to mohlo fungovat bez té dvojtečky? Já právě nechápal proč tam je porovnávací podmínka. Jo už to jede.

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #6
-
0
-

#5 oxidián
já kopíroval a upravil to tvoje, nevšiml tu : jsem zapoměl

jukni ještě na ten předchozí příspěvek ode mě, omylem jsem editoval místo abych dal novej.

jinak lze aplikovat s menší úpravou i na Tstrings, nebo Array of string.

na strings z Listboxu to nejde protože je obalenej v tý třídě Listboxu.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #7
-
0
-

ještě budu muset udělat vyhledávání podle autora, názvu knihy, nakladatelství a roku vydání a adresáře abych mohl ověřit že kniha neexistuje v seznamu když kliknu na přidat nebo uložit. Tak se chci zeptat je tohle dobré řešení? (Ještě neotestováno)

function search(str: string);
var i: Integer;
List : TStrings;
begin
  List := TStringlist.Create;
  for i := 0 to listbox1.items.count-1 do  
  begin
    try
      ExtractStrings([';'], [], PChar(listbox1.items[i]), List);
      // ... porovnávací podmínky zde ...
    finally
    List.Free;
  end; // end for
end;

Jako funkci jsem to dal protože budu mít dvě funkce, které budou zajišťovat kompatibilitu sloupců. Pokud nějaký kód používám dvakrát tak tam raději dám tu funkci. Někdo to třeba po mě bude opravovat a takhle bude vědět, že to má změnit na jednom místě a ne na dvou. Protože kdybych třeba přehodil sloupce nebo něco tam vložil a změnil bych to jen na jednom místě, pak by mohl vzniknout guláš v "databázi". Je to jen malá funkcička, ale pro přehlednost docela podstatná.

Nějaké knihovny a OOP neřeším. Nemám na to čas. Hlavně aby to bylo co nejdříve hotové.

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #8
-
0
-

#7 oxidián
tím že si to nepředěláváš, na objekty si jen přiděláváš práci, máš pak spoustu stejnýho opakujícího se kodu, jen s drobnejma změnama.

no u tý tvý funkce jde hlavně o to, že musíš vracet pole pokud chceš aby ti to vracelo všechny výskyty a jde udělat univerzálněji pro všechny typy hledání když si do argumentů zadáš index v jakém poli to hledat

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #9
-
0
-

#8 MilanL
Nemá to vracet výskyty. Jde jen o to ověřit jestli ten záznam už existuje. Takže vracet moože boolean.

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #10
-
0
-

#8 MilanL
pokud chceš pokračovat v tom tvým způsobu, tak bych bejt tebou si to alespoň zjednodušil,

udělal bych si v knihách 1 položku navíc ID jako index,

dál bych si vytvořil seznamknih : array of TStrings, kde bych udržoval to rozdělění na součásti

udělal bych si funkci která mi to do listboxu doplní podle potřeb třeba podle filtru autora (proto je potřeba ID jelikož index z Listboxu nebude odpovídat indexu v seznamu knih)

právě kvůli těmhle věcem se to dělá bud objektově nebo aspon přes Záznamy (typ Record).

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #11
-
0
-

id nemaj smysl protože nevíš kolik by vzniklo duplicitních záznamů se stejným ID. Každý uživatel by to měl jinak. Vzhledem ke způsobu šíření toho programu na internetu i mimo internet (v rámci flashek apod.).

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #12
-
0
-

Jde o další věc, o přehlednost až to budeš ty nebo někdo jinej azs vylepšovat nebo předělávat, aby tomu kodu bylo rozumět.

Já dostal včera taky za úkol menší rozšíření programu psaného v D6 před nějakejma 15 lety, bejvalým zaměstnancem. Je to s Databází a v tý DB je celkem dobrej guláš, že nevím nevím. spousta nepoužívaných tabulek, nebo duplicitní údaje na X místech prostě děs.
 

#11 oxidián
Ty ID nemusí bejt ukládaný, stačí tam dát pořadí záznamů v tom souboru.jde pouze o vnitřní využití.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #13
-
0
-

Kdo to chce objektově a s id tak ať si to napíše sám. Já na to nemám čas.

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #14
-
0
-

Navíc v dnešní době není problém mít ten soubor s knihovnou někde na netu přístupnej i na přidávání záznamů a pokud se o to bude někdo starat, tak ty záznamy mohou být rozlišené autorizované a neautorizované. Navíc když si lidi stáhnou program budou ten soubor knih mít jen lokálně pro sebe, navíc bys musel ošetřit instalaci nových verzí, abys ty knihy uživatele nepřemazal, nebo mít 2 soubory jeden globální šířenej s programem a druhej lokální kam si ukládaj seznam knih uživatelé, Prostě děláš něco co nemáš moc dobře promyšlené nebo se odkazuješ na věci se kterýma se ani nepočítá. Že bude mít jeden uživatel jiné indexy než druhý jim i tobě může bejt úplně jedno.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #15
-
0
-

O to se rozhodně nikdo starat nebude, leda že by si se o to chtěl starat ty a hostovat to na svém serveru. Ale musel by sis to pak taky sám naprogramovat.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
27. 5. 2017   #16
-
0
-

Není mi jasné proč mi to krachne (verze 2.52) když otevřu Nástroje/Vytvořit učebnici, vyberu první knihu a k názvu knihy přidám číslo 2.

Záložky si nastavím v souboru book na řádky 118 a 124.

Pak zmáčknu Přidat. Krachne to na řádku 125:

ri := ExtractStrings([';'], [], PChar(listbox1.items[i]), List);

tedy v části except to hodí Err 2.
Celá funkce:

// result false - the book must not be added to the list
function TBooksDialog.isBookInList: boolean;
var i,r,ri: Integer;
List : TStrings;
test: string;
begin
  List := TStringlist.Create;
  r := -1;
  for i := 0 to listbox1.items.count-1 do
  begin
    try
      test := PChar(listbox1.items[i]);
    except
      ShowMessage( 'err 1:' + test);
    end;

    try
      ri := ExtractStrings([';'], [], PChar(listbox1.items[i]), List);
    finally
      ShowMessage( 'err 2' );
    end;
          // Název knihy              autor                       rok vydání
      if (trim(edit2.Text) = List[0]) and ( (edit3.Text=List[1]) or (edit5.Text=List[4]) ) then
       begin
            // adresář
       if ( trim(edit7.Text)=List[7] ) then
         begin
           ShowMessage('Nelze vložit knihu. Adresář s tímto názvem je určený pro jinou knihu.');
           result := false;
           exit; // Exit function
         end;

         //  název knihy
       if ( trim(edit2.Text)=List[0] ) then
          begin
           if MessageDlg('Kniha od tohoto autora už je v seznamu. Presto pokracovat?',
              mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              begin result := true; exit; end// do not process next items because user wants to add the book into the list regardless duplicate existance
           else
            begin result := false; exit; end;
          end;

         // Autor
       if ( trim(edit3.Text)=List[1] ) then
          begin
           if MessageDlg('Kniha od tohoto autora už je v seznamu. Presto pokracovat?',
              mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              begin result := true; exit; end // do not process next items because user wants to add the book into the list regardless duplicate existance
           else
            begin result := false; exit; end;
          end;

         //  nakladatelství
       if ( trim(edit4.Text)=List[2] ) then
          begin
           if MessageDlg('Kniha od tohoto nakladatelství už je v seznamu. Přesto pokračovat?',
              mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              begin result := true; exit; end // do not process next items because user wants to add the book into the list regardless duplicate existance
           else
            begin result := false; exit; end;
          end;
         //  rok vydání
       if ( trim(edit5.Text)=List[4] ) then
          begin
           if MessageDlg('Kniha v tomto roce už byla vydaná. Presto pokracovat?',
              mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              begin result := true; exit; end// do not process next items because user wants to add the book into the list regardless duplicate existance
           else
            begin result := false; exit; end;
          end;
       end;
    List.Free;
  end; // end for
  result := true; // no such book in the list
  exit;
end;
Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #17
-
0
-

#16 oxidián
je rozdíl mezi Pchar a PwideChar

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
27. 5. 2017   #18
-
0
-

#17 MilanL

PChar je pointer na řetězec ukončený nulou. Primárně je určen pro spolupráci s API nebo C. Přetypování řetezce je PChar(s). V případě, že s je AnsiString není v podstatě žádná konverze, jelikož AnsiString je ukončen 0.

PWideChar je pointer na WideString. Pokud používáte UTF8, tak to je uloženo jako AnsiString, ale neplatí, že jeden byte = 1 znak.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
27. 5. 2017   #19
-
0
-

#18 MilanL
ted koukám že jionde ti to funguje tak zádrhel bude jinde. prostuduju a dám vědět.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
27. 5. 2017   #20
-
0
-

#19 MilanL
máš blbě ten try blok, finaly se provede v obou případeh at je úspěch nebo chyba.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
27. 5. 2017   #21
-
0
-

#20 MilanL
už jsem to našel list create musíš mít uvnitř cyklu, na konci ho uvolňuješ a v druhém cyklu není vytvořen.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
27. 5. 2017   #22
-
0
-

#21 MilanL
druhá možnost je na konci cylku použít list.clear;

a free použít až na konci procedury - není nutné locální proměná měl by se postarat kompiler.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #23
-
0
-

#22 MilanL
A proč nepřesunout List.Free; za

 
end; // end for

?

Myslel jsem že příkaz

ri := ExtractStrings([';'], [], PChar(listbox1.items[i]), List);

vyplní ten List od začátku... A ty říkáš, že se to tam přičítá? (Proč jinak clear?)

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #24
-
0
-

#23 oxidián
no můžeš to zkusit osobně si myslím. že ten extractstring bude přidávat. stačí místo free použít clear uvnitř smyčky.

tohle je z docwiki.embarcadero z popisu extract tring

Strings is a string list to which all substrings parsed from Content are added. The string list is not cleared by ExtractStrings, so any strings already in the string list are preserved.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
27. 5. 2017   #25
-
0
-

Super, Už to funguje. Díky moc. Bez .clear to nefunguje. Ještě je problém s tím že některé české znaky se nesprávně zobrazí v tom ShowMessage. jako ř a č nebo ě, takže jsem je nahradil bez diakritily

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
27. 5. 2017   #26
-
0
-

#25 oxidián
to už je problém v kodování string ansistring

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
28. 5. 2017   #27
-
0
-

Dá se z toho listbox.items zjistit na kolikátý řádek jsem kliknul? Myslím jestli tam je metoda která vrací tu hodnotu nebo vlastnost ke které mohu přistoupit. A dále potřebuju metodu pomocí které řeknu že chci zaměnit ten konkrétní řádek (kvůli uložení dat při editaci).

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
28. 5. 2017   #28
-
0
-

Na stackoverflow jsem se dočetl že " Since AFAIK ShowMessage() uses the system default font, you can't use this procedure for displaying messages containing "strange" characters: you need to write your own ShowMessage dialog box."

a

ShowMessage (in D7) use the system message font. How can an application use the character set it wants? – Sertac Akyuz Sep 9 '14 at 13:00

@SertacAkyuz right, but I wrote in my answer, that a dialog with a text field is needed (instead of the ShowMessage which sticks to the default locale) – mjn Sep 9 '14 at 13:21

To samé by tedy mělo platit ohledně mtConfirmation ...

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
28. 5. 2017   #29
-
0
-

#27 oxidián
listbox itemindex máš to pořadí řádku, stačí uložit a po editaci listbox.items[uložené číslo] .= nová hodnota

ten index už používáš při tom vyplnění pro editaci při kliknutí, stačí hodit do proměný editradek

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
28. 5. 2017   #30
-
0
-

Když vyberu 1. knihu, přejmenuju ji a zmáčknu uložit, tak dostanu hlášku -1. Aktuální verze je už nahraná

procedure TBooksDialog.save1Click(Sender: TObject);
begin
if ( not isBookInList ) then // pokud kniha existuje, nepřidávat
   exit;
   ShowMessage(inttostr(listbox1.itemindex));
   // save edits
end;
Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
28. 5. 2017   #31
-
0
-

Funguje to jen uvnitř listbox1click nikoliv uvnitř save1click. To že dovnitř listbox1click musím dát currenListtIndex:=listbox1.itemindex abych to měl uložené...

Jsem přehlédl, že ty si psal, že se ta hodnota má uložit.

Nahlásit jako SPAM
IP: 78.102.61.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý