Sdílení a iniciace proměnné recentFiles – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Sdílení a iniciace proměnné recentFiles – Delphi – Fórum – Programujte.comSdílení a iniciace proměnné recentFiles – Delphi – Fórum – Programujte.com

 

oxidián0
Grafoman
4. 6. 2018   #1
-
0
-

Aktuální verze 2412.  

v UC_heb1.pas a Testy.pas mám proměnnou recentFiles, pole stringů, která má být sdílená oběma moduly.

V modulu Testy mám metodu

TTesty.readINI - kde se pole iniciuje při spuštění programu

TTesty.writeINI - která se spouští při ukončení programu a má zapsat do souboru .ini recent files.

Na řádku #346:

   for i:=0 to length(recentFiles)-1 do
      if recentFiles[i]<>'' then
        writeln(f,recentFiles[i]);


Zde je ale problém s tím, že v tuto chvíli recentFiles[i] není iniciováno, ačkoliv jsem ho už jednou inicioval přes readINI na řádku 135:

  for i:=0 to maxRecentFiles-1 do
    recentFiles[i]:='';


Co mi teda uniká, v čem je problém?

PS: Do adresáře Testy jsem umístil soubor test.a.tss který můžete otevřít přímo z programu. Po ukončení, se v menu Soubor vytvoří název souboru. Po ukončení testu, který můžete ihned přerušit a následném ukončení programu, se název souboru ( recentFiles[i] ) má zapsat do souboru .ini ... Což se neděje.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
5. 6. 2018   #2
-
0
-

#1 oxidián

čau, zjisti si kde je chyba, jestli je problém s tím polem recentfiles nebo se souborem ini v " f ".

Podívám se Ti na to odpoledne, doma.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
5. 6. 2018   #3
-
0
-

čau, tak jsem to vyzkoušel a mě to funguje.

načetl jsem ten test z Testy a zavřel program a do ini se to krásně zapsalo.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
5. 6. 2018   #4
-
0
-

Ahoj. Dík. Teď na to koukám že se to zapisuje. Spíš bude problém že se to nenačetlo.

Už jsem to opravil v readINI:

  isPosledniTestyFound := false;
  repeat
    if (line='[poslední testy]') then
        isPosledniTestyFound := true;
    readln(f,line);
  until isPosledniTestyFound or eof(f);

  if isPosledniTestyFound then
    recentFiles[0] := line;
  i:=1;
  repeat
      readln(f,recentFiles[i]);
      inc(i);
  until ((recentFiles[i]<>'') or (i=maxRecentFiles-1)) or eof(f);

Ještě musím přijít na to proč nejde recent soubor otevřít.

Jinak jsem začal dělat na vychytávce, která dělá to testování trochu těžší. Odpovědi, které se zobrazí na pravé straně je možné částečně vytečkovat, tak aby člověk více namáhal mozkové závity. Chtěl bych to udělat tak, že nejdříve změřím jak rychle žák reaguje při výběru slovíčka, když je odpověď zřejmá. Výsledky reakcí/prodlev mezi slovíčky pak zapíšu do souboru. A z toho pak budu odvozovat jestli to žákovy jde nebo ne*. Udělal bych inteligentní výběr slovíček - slovíčka která žák zvládá rychle se odsunou stranou a připomenou se za delší dobu.

* Příklad:

10 slovíček, kde jsem naměřil časy reakcí na testu kde odpověď byla zřejmá: 2,1,2,2,2,1,2,1,2

pak u vytečkovaných slovíček bude mít časy např:

6,8,10,8,12,6,5,7,8

no a to nastavím tak, že když bude mít časy pod

4,2,4,4,4,2,4,2,4 .... tedy bude to mít pod průměrem 3, tak to uznám, jako že už to umí a může jít na další soubor...

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
5. 6. 2018   #5
-
0
-

#4 oxidián
no lítáš od jednoho k druhýmu to není nejlepší, ikdyž někdy může pomoct chvilku dělat na jiné části.

Koukal jsem ještě na ten druhej dotaz ohledne mazani menu items, je třeba si ošetřit aby to spravne fungovalo, aby se smazalo vše co má a ve správném pořadí.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
6. 6. 2018   #6
-
0
-

Recent files už funguje, verze 2413

Ale teď nevím co máš namysli mazáním menu items.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
6. 6. 2018   #7
-
0
-

#6 oxidián
clearDots funkce - druhé vlákno o víkendu, uz zamcené jako vyřešené.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
6. 6. 2018   #8
-
0
-

Tak tam nejde o mazání, ale o zrušení odškrtnutí. Tuto funkci ale už nepoužívám

function clearDots(obj: TMenuItem):integer;
var i:integer;
begin
  for i:=0 to obj.count-1 do
    obj.items[i].checked := false ;
end;

Momentálně ji nikde nepotřebuji. Tato funkce se dá použít jenom tam, kde je jedna skupina položek. Pokud tam je více skupin, tak se zruší úplně všechny skupiny.

Nahradil jsem ji touto funkcí:

{
 check_uniqItem - Vybere unikátní položku z menu
    akce: A) umožňuje zrušit zaškrtnutí všech položek
             v dané skupině položek menu a následně
             zaškrtnout tu, která byla v této skupině
             volána. To umožňuje také zrušení zaškrtnutí
             všech položek, pokud funkci zavoláte s
             položkou menu, která není v zadané skupině
          B) umožňuje deaktivovat nebo aktivovat
             položky menu v dané skupině
             k deaktivování používám hodnotu skupiny * -1
             k opětovnému aktivování skupiny je
             třeba zavolat skipCheckingMenuItems(true);
             a následně ještě zavolat check_uniqItem
             Následně zase zavolat skipCheckingMenuItems(true);

 Je možné použít i mimo menu Teèkování
 GroupIndex: defines which group of items should be used
 If GroupIndex is negative, the menu items will be disabled
 GroupIndex - 0 - unlimited ... for nested

 skipCheckingMenuItems(); ovlivňuje funkci check_uniqItem
 }
  procedure TDotting.check_uniqItem(menu: TMenuItem; GroupIndex: Integer; Sender: TObject);
  var i:integer;
      Par: TMenuItem;
      disable_all: boolean;
  begin
    if GroupIndex < 0 then
      begin
        disable_all := true;
        GroupIndex := abs(GroupIndex);
      end;
    if GroupIndex = 0 then
      clearDots(menu)
    else
      begin
        par := TMenuItem(Sender).Parent;
        for i:= 0 to par.count-1 do
          begin
           if ( Par.items[i].GroupIndex = GroupIndex ) then
                  begin
                  if ( Self.dotting_skipCheckingMenuItems = false ) then
                    Par.items[i].checked := false ;
                  if Self.dotting_enabled = true then
                    begin;
                      if disable_all = true then
                        Par.items[i].enabled := false
                      else
                        Par.items[i].enabled := true;
                    end;

                  end;
          end;
      end;
    if ( Self.dotting_skipCheckingMenuItems = false ) then
      TMenuItem(Sender).checked := true;
  end;

Kde se rozlišují skupiny položek menu. Tahle funkce je fajn.

Teď potřebuju zjistit, proč se neotvírá dialogové okno jmeno.pas po startu.

Kdysi tam bylo okno pomocí kterého ses měl jako přihlásit.

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
6. 6. 2018   #9
-
0
-

#8 oxidián
Přišel jsem na to že zobrazení toho formuláře pro výběr uživatele obsluhuje

TForm1.SelectUser1Click(Sender: TObject);

ale jak tuto funkci zavolat (kromě vyvolání z menu Nastavení)? Co mám dosadit místo Sender?

Když zavolám SelectUser1Click(Sender);

zevnitř funkce TForm1.FormCreate(Sender: TObject);

tak to krachne.

Nahlásit jako SPAM
IP: 78.45.195.–
gna
~ Anonymní uživatel
1891 příspěvků
6. 6. 2018   #10
-
0
-

Sender je vždycky objekt, kterého se událost týká. V tomhle případě to asi bude instance TMenuItem.

Taky se handlery nevolají přímo, ale bylo by to metodou Click, která vyvolá OnClick (který je asi v tomhle případě nastavený na ten SelectUser1Click) se správným parametrem.

A vzhledem k tomu, že OnCreate (FormCreate) se volá při vytváření objektu formu, tak bych nečekal, že v té době bude připravený na operace, které se v tom click handleru dělají. Možná to půjde při OnShow (FormShow).

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
7. 6. 2018   #11
-
0
-

Jde to takto:

procedure TForm1.FormShow(Sender: TObject);
begin
  if TestyOrganizer.skipFontTest=false and zacatek then
    ftestfont.showmodal;
  SelectUser1Click(Sender);
end;

Akorád formulář trochu upravim.

Nahlásit jako SPAM
IP: 78.45.195.–
gna
~ Anonymní uživatel
1891 příspěvků
7. 6. 2018   #12
-
0
-

Sender je vždycky objekt, kterého se událost týká.

Takže obsluze kliku na menuitem asi nebudeš přeposílat form! Jestlit to správně chápu, tak je to N9, takže to bude:

N9.Click;
// nebo
SelectUser1Click(N9);

Jen díky tomu, že se tam s tím parametrem nijak nepracuje nevadí, že tam cpeš nesmysl. Máš tam hromadu metod, ze kterých je vidět, jak to funguje. Dokonce jsi napsal pár vlastních, tak nad tím chvíli přemýšlej!

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
7. 6. 2018   #13
-
0
-
Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
7. 6. 2018   #14
-
0
-

#13 oxidián
udělal bych funkci selectuser bez parametru a pak ji volal z create i z selectuser1clicku.

jinak drobnost k  #8 oxidián

na Boolean vlastnosti v podmínce if nemusíš dělat if něco = false(true) then  hodnota něco lze použít přímo, jen je třeba při testu na false dát if not něco then a u true stačí if něco then - tedy compiler si to tak stejně udělá, jestli to máš kvůli čitelnosti kodu pro tebe, tak to je jiná.

- druhá věc nastavení boolean parametru v rámci podmínek na jiné parametry se dá obejít bez podmínek

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
7. 6. 2018   #15
-
0
-

#14 MilanL
napadlo mě že se zeptám podmínka  not ( (expresion1) or (expresion2) ) je to samé jako podmínka ( expresion1 nor expresion2 ) ?

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
7. 6. 2018   #16
-
0
-

#15 oxidián
 v podstatě ano, ale ten první zápis je myslím lepší, já nor nepoužívám

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
7. 6. 2018   #17
-
0
-

Lze TStringList vracet ve funkci? Rád bych věděl proč mi to krachuje při návratu z funkce:

function TFile_monitoring.findFiles(name: string):integer;
var OkruhyDir: string;
begin
//  Self.monFiles := TStringList.create();
  OkruhyDir := 'R:\++hebrejština\HEB\Písně\Sarah Liberman';
  Self.monFiles := CreateOkruhyFilesList(OkruhyDir, '*');
end;

function createOkruhyFilesList(OkruhyDir: string; wildchar: string):TStringList;
var i: Integer;
  OkruhyFiles : TStringList;
  SearchRecord : TSearchRec;
begin
  OkruhyFiles := TStringList.create();

  if FindFirst(OkruhyDir + '\' + wildchar,faAnyFile,SearchRecord)=0 then
    begin

    while FindNext(SearchRecord) = 0 do
      begin
        if (SearchRecord.Attr = 16 {faDirectory}) or (SearchRecord.Name = '.') or (SearchRecord.Name='..') then
          continue;
        OkruhyFiles.Add(SearchRecord.Name);
      end;
    SysUtils.FindClose(SearchRecord);
    end;
  Result := OkruhyFiles;
end;
Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
7. 6. 2018   #18
-
0
-

Jsem nad tím faral jak cip, a nakonec jsem zjistil, že jsem neměl vytvořenou instanci třídy, proto mi to nešlo uložit ty výsledky.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
8. 6. 2018   #19
-
0
-

#18 oxidián
mě se funkce s návratovým typem TStringList nebo TStrings neosvedčili, používám trošku jinou konstrukci předám tu proměnnou do třídy jako var a tam jí naplním, v podstatě co jsem koukal na ofic.fora delphi, tak jako návratovej typ to téměř nikdo nepoužívá.

EDIT:

volání
var
   mujList : Tstringlist; (nebo TStrings)
...
naplnList(mujList)

procedura nebo funkce
procedure/function naplnList(var outList : Tstrings)

uvnitř lze bud pracovat přímo s výstupem nebo vytvořit 
lokální proměnou a na konci použít přenos do výstupu 
pomocí addstrings nebo append např. 

outList.addstrings(lokalniList);

add a append jsou stejné funkce jen add navíc vrací index
Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
8. 6. 2018   #20
-
0
-

Jo pochopil jsem, už jsem to tak udělal.

Je nějaký efektivní způsob jak přiřadit prvky pole do proměnných? Pro představu v PHP existuje něco podobného:

list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $line_arr);

nebo rovnou z textového řádku s oddělovači, ještě nerozděleného.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
8. 6. 2018   #21
-
0
-

#20 oxidián
no to explode je jednoduchý já na to mám funkci, která formátovanej vstup rozdělí bud do string array nebo T strings/List/

do proměnných to pak musíš naházet ručně.

v C bych použil case of bez breaků
case počet naparsovaných parametrů (length(array)/Tstring...Count a od nejvyšší hodnoty bych doplnoval do proměnných bez breaků tzn, doplni poslední parametr a pak k němu všechny ostatní až po Break,

to u delphi takhle nejde tam je obsluha jen v rámci jedné hodnoty, tzn řada if.ů,  

další variantou je v případě že jsou všechna data string použít u TStringlist páry name-value, ale ten přístup k nim je složitější, 

K value je to List.Values("name")

k name je to List.Names.(index) - a ten indek je třeba nějak najít, problémem můžou být duplicity v hodnotách.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
8. 6. 2018   #22
-
0
-

při použití více různých oddělovačů, lze do jednoho textu dát i více polí, nejdřív rozdělíš podle jednoho oddělovače a pak ty další podle dalších oddělovačů např když je tam čas tak nejdřív třeba podle , na pole proměnejch a pak podle : rozdělit čas na hh,mm,ss

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
8. 6. 2018   #23
-
0
-

#21 MilanL

Ty brďo já ani nevěděl, že ten list může držet páry informací. Já právě včera řešil jak to udělat, když k těm slovíčkům, které jsou v LIstbox1 potřebuju přiřadit id slovíčka nebo číslo řádku v souboru - prostě identifikátor. V tom TStringListu jsou ty popisky myslím naházené pod .strings. Pak se to zamíchá funkcí exchange a v tu chvíli člověk ztrácí přehled o jedinečnosti každého slovíčka, proto i monitorovat každé slovíčko, jak si žák vede a jestli se ho už naučil jsem chápal jako problém.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
8. 6. 2018   #24
-
0
-

#23 oxidián
v Tstrings jsou jen páry string-string, existuje i třída Dictionary s páry typ-typ, ale nevím jestli tvoje verze D tu třídu TDictionary

Pokud bys nad .Tstrings dělal míchání, šlo by to i jinak před mícháním vytvořit pole s indexy a naplnit pole[i]=i, a při míchání stejným způsobem míchat i pole indexů.

Nebo jednodušší nemíchat Tstrings se slovíčky, ale náhodně k němu generovat index slovíček ke zkoušení, a to naučení mít v poli naučeno, kde indexy navzájem odpovídají.

 hele to je na delší debatu, lepší by dokonce bylo o tom kecat na nějakým chatu, 

napiš mi na E-mail: lhotak.milan1970@seznam.cz dohodnem si formu komunikace a časy kdy se tomu můžem věnovat, já mám tenhle víkend v podstatě volný, takže dnes od 15-16h do nedělního večera budu dostupný téměř furt

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
8. 6. 2018   #25
-
0
-

Ten čas o víkendu by mi vyhovoval. Možná i dnes odpo pokud nebudu unavený.

Napsal jsem ti mail. Teď řeším toto:

function extract_params(var line: string; delim: char; var aa; var bb; var cc; var dd ):integer;

implementation

// Extract parameters from file.
function extract_params(var line: string; delim: char; var aa; var bb; var cc; var dd ):integer;
begin
  oo := TStringList.Create;
  ExtractStrings([' + delim + '],[],PChar(line), oo);
  if (oo.count >= 1) then
    aa := oo[0];
  if (oo.count >= 2) then
    bb := oo[1];
  if (oo.count >= 3) then
    cc := oo[2];
  if (oo.count >= 4) then
    dd := oo[3];
  Result := 0;
  oo.free;
end;


Chyba:

[Error] functions.pas(31): Unsatisfied forward or external declaration: 'extract_params'

Použití:

   if ( checkSmerVersion() ) then
        extract_params(line, ';', par_A, par_B )
      else
        extract_params(line, ';', par_A )

Myslel jsem že mi to nevezme a že to budu muset přetížit. Ale místo toho mi to hází jinou hlášku.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
8. 6. 2018   #26
-
+1
-
Zajímavé

#25 oxidián
chybí ti tam typy u těch proměnnejch, nelze bez typu, pokud bys to chtěl univerzálně tak by měli být variant.

a ty podmínky bych udělal jenom s > a od 0 tzn

místo >=1 dát >0
místo >=2 . . . >1 atd.

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
8. 6. 2018   #27
-
0
-

Dík. Jsem už byl přetažený. A navíc jsem tu funkci strčil za end. a tu hlášku jsem asi přehlédl.

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
10. 6. 2018   #28
-
0
-

jak to udělat, když potřebuju nastavit cestu Self.TestyDir na Self.dir , ale o jednu uroven vyse?

Napr mám Self.dir := 'R:\jedna\dva';
A já potrebuju nastavit  Self.TestyDir := 'R:\jedna\' + 'Testy';

Edit: Už jsem na to asi přišel. Použiju LastDelimiter

a pak copy

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
10. 6. 2018   #29
-
0
-

Ještě potřebuju poradit jak nastavit událost onclick těm položkám menu:

        for j:=0 to Self.SubDirs.count-1 do
          begin
          idx := Self.JazykyIndexy.IndexOf(Self.Jazyky[i]); // najít ID menu daného jazyka
          Self.SubMenuItems[i][j] := TMenuItem.Create(form1.Testy);
          Self.SubMenuItems[i][j].Caption := Self.SubDirs[j];
          Self.SubMenuItems[i][j].onclick := 'selectUniqUcebnice';
          Self.langMenuItems[idx].Add(Self.SubMenuItems[i][j]);
          end;

To vrací chybu:
[Error] testy.pas(429): Incompatible types: 'TNotifyEvent' and 'String'

To znamená, že musím tu událost nějak vytvořit?

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
11. 6. 2018   #30
-
+1
-
Zajímavé

#29 oxidián
do onclick nepatří název procedury jako string ale přímo ta procedura tzn např.

Self.SubMenuItems[i][j].onclick := selectUniqUcebnice;

a proceduru je třeba mít nadefinovanou stejně jako je základní definice OnClick události tzn.

procedure selectUniqUcebnice(Sender : TObject); 
.... 

v případě že procedura bude součástí některé třídy. tak samozřejmě zadat včetně třídy tzn.

Self.SubMenuItems[i][j].onclick := třída.selectUniqUcebnice;

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
13. 6. 2018   #31
-
0
-

Dík za rady. Menu Testy->Jazyk->Učebnice už funguje skvěle. Teď rozjíždím menu Okruhy->adresáře. Pak ještě udělám menu Fitry, na filtrování jen určitých souborů... A nakonec ještě jedno menu, ale nevím jak ho pojmenuju. Asi lekce.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
14. 6. 2018   #32
-
0
-

#31 oxidián
no kdybys dobře obalil Testy, šli by použít i pro ty další skupiny, do řídících proměných bys nastavil cestu a vstupní bod v menu a ostatní by bylo stejné nebo rozdíl jen v maličkostech, které by se dali nastavit dalšími proměnými.

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
14. 6. 2018   #33
-
0
-

Nechtěli byste mi poradit s touto chybou?

https://sourceforge.net/projects/uc-heb/files/developer_backups/2018/unfinished/ucheb.2414.zip/download

break on testy.pas #548

Self.FoldersDirs := Self.createOkruhySubFoldersList(Self.OkruhyDirs[i]);

 
Self.FoldersDirs access violation
 

function TTesty.createOkruhySubFoldersList(subdir: string):TStringList;
begin;
  if not assigned(Self.FoldersDirs) then
    Self.FoldersDirs := TStringList.create();
  Self.FoldersDirs.clear;
  Self.current_okruh_path := Self.current_ucebnice_path + '\' + subdir + '\';
  createDirsList( Self.current_okruh_path, Self.FoldersDirs);
end;

Self.FoldersDirs set OK.


FoldersDirs
 je nadeklarované FoldersDirs: TStringList; v třídě TTesty. jako private.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
15. 6. 2018   #34
-
0
-

#33 oxidián

Self.FoldersDirs := Self.createOkruhySubFoldersList(Self.OkruhyDirs[i]);

zkus to bez toho self u funkce, tam to nepatř pokud chceš použít funkci určit třídy musíš jí volat na třídě a ne na objektu tzn když už tak:.

Self.FoldersDirs := TTesty.createOkruhySubFoldersList(Self.OkruhyDirs[i]);

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
15. 6. 2018   #35
-
0
-

Dobře, self jsem odstranil, ale na dalším řádku v podmínce kde je Self.FoldersDirs.count se to sekne.

Watch Self.FoldersDirs.count píše Evaluating... jako by to nemohl spočítat.

Edit:

Jsem to předělal, a teď už to tu chybu nedělá:

function TTesty.createOkruhySubFoldersList(subdir: string; var list: TStringList):integer;


Dík

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
15. 6. 2018   #36
-
0
-

#35 oxidián
Ještě mám dotaz. Řádkem

Self.OkruhyMenuItems[i].Add(Self.OkruhySubMenuItems[i][j]);


Přidávám soubory. V kukátku zkontroluju - hodnota je tam přidaná. Ale v menu Okruhy se nezobrazí žádné menu. Nevíš na co jsem zapomněl?

2414

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
15. 6. 2018   #37
-
0
-

#36 oxidián
jsi to kopíroval co?

v cyklu přidání okruhů tyto úpravy:

Self.OkruhyMenuItems[i] := TMenuItem.Create(form1.Testy); 
má být ..Create(form1.Okruhy)

druhá řádka pod tím zrušit tu poznámku, jinak se to do 
menu nepřidá jen jsi vytvořil objekt položky, 
ale bez navázání se to neobjeví

//  form1.Okruhy.Add(Self.OkruhyMenuItems[i]);
Nahlásit jako SPAM
IP: 193.165.115.–
MilanL+1
Grafoman
15. 6. 2018   #38
-
+1
-
Zajímavé

#37 MilanL
správně bys u testů i okruhů pak u těch submenu items měl mít v create nadřazenej item

Self.SubMenuItems[i][j] := TMenuItem.Create(form1.Testy); 

melo by být ...Create(self.TestyMenuItems[i]);

a to samé u okruhů

Self.OkruhySubMenuItems[i][j] := TMenuItem.Create(form1.Okruhy);   ..Create(Self:OkruhyMenuItems[i]);

Nahlásit jako SPAM
IP: 193.165.115.–
oxidián0
Grafoman
15. 6. 2018   #39
-
0
-

Dík toho form1.Testy místo form1.Okruhy jsem si nakonec všiml, toho zakomentovaného řádku už ne. Už mi to jede :-)

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
16. 6. 2018   #40
-
0
-

#39 oxidián
odhaduju, že se ti okruhy objevili  v Testy menu a proto si to zakomentoval nebo jsi po zkopirovani zakomentoval vsechno a postupne rušil koment.

Jen poznámečka, nebyl by problem to dat oboji do stejne funkce, vše v čem se to liší by šlo předat v argumentech (dir, který menu, obe menuitem pole), ale už to nech pro tebe je to asi přehlednejší a i to přehnaný používání self. je nejspíš pro tvojí přehlednost.

Nahlásit jako SPAM
IP: 193.165.115.–
oxidián0
Grafoman
16. 6. 2018   #41
-
0
-

Ony ty funkce se liší především v tom, že Testy se načítají z konfiguráku, položky menu mohou mít jiný název než adresáře. U Okruhů se to načítá přímo z adresářů, bez použití konfiguráku.

Dalo by se nastavit aby se položky pod Testama a Okruhama zobrazili s menším odsazením? Teď to odsazení je přehnané, protože nepoužívám .checked

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
16. 6. 2018   #42
-
0
-

Ještě dotaz jak to udělat, když chci zobrazit informaci, ale 1) v dialogu showmessage se mi nezobrazuje česká diakritika/čeština 2) nevím jak tam vložit zalomení nového řádku:

function TTesty.getSelectedStr():string;
begin
    Result := 'Jazyk:' + self.current_jazyk_name +
    'Učebnice:' + self.current_ucebnice_name +
    'Okruh' + self.current_okruh_name +
    'Podadresář:' + self.current_folder_name;
end;
procedure TForm1.ShowInfo(Sender: TObject);
begin
  showmessage('Vybrali jste:' + TestyOrganizer.getSelectedStr() );
end;
Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
16. 6. 2018   #43
-
0
-

Na newline jsem přišel sLineBreak . Ještě nevím jak zobrazit ten řetězec v češtině

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
16. 6. 2018   #44
-
0
-

Wow, rozjel jsem to:

procedure TForm1.ShowInfo(Sender: TObject);
var str: String;
begin
  str := 'Vybrali jste:' + sLineBreak + TestyOrganizer.getSelectedStr();
  application.MessageBox(pansichar(str), '', MB_OK);
end;
Nahlásit jako SPAM
IP: 78.45.195.–
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, 3 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ý