Ziskanie nastavenia aplikacie   zodpovězená otázka

VB.NET, WinForms, .NET

Nazdar

Da sa niakim rozumnym sposobom ziskat vypis vsetkych My.Settings ? v programe ich mam naozaj vela a napisat riadok dlhy jak toaletny papier asi nieje rozumne :\ .

dakujem za odpoved.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přes Reflection to půjde určitě, možná je i jiný způsob, ale nevím o něm:

For Each p In My.Settings.GetType().GetProperties()
    MsgBox (p.Name)
Next
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dakujem velmi pekne :) ano urcite to bude fungovat , skoda ze mi to nenapadlo ved je to celkom jednoduche.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ah nie vyskusal som kod a vypise niake slova o synchronizacii a medzi nimi aj My.Settings , ale iba ich nazvy a ich hodnotu nie dalo by sa to niako prerobit ?

Dakujem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kód, který jsem poslal, vypíše všechny vlastnosti objektu, který dostanete, když napíšete My.Settings. Vyfiltrujte si z nich ty, co tam být nemají.

Hodnotu dané vlastnosti získáte přes GetValue (dejte to do toho cyklu):

Dim hodnota As Object = p.GetValue(My.Settings, Nothing)

Hodnota se dává do proměnné typu Object, protože nevíte, jakého typu vlastnost je (může být String, Integer atd., každá může mít jiný typ).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dakujem pomohlo to zasa o nieco viac :) tu je konecny kod :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        For Each p In My.Settings.GetType().GetProperties()

            Dim hodnota As Object = p.GetValue(My.Settings, Nothing)

            MsgBox(p.Name)

            MsgBox(hodnota.ToString)

        Next

    End Sub
End Class

Mam este kratku otazku - ako sa da zistit ze je na konci citania hodnot ? lebo v poriadku vypise vsetky polozky aj s ich hodnotami , ale ked pride na koniec vypise chybu :Parameter count mismatch. a to pravdepodobne znamena ze je na konci a z riadku kde zacina For Each nevybralo dalsiu polozku a dalsi riadok sa znej pokusil vybrat hodnotu ,ktora neexistovala. Vyriesil som to blokom Try Catch EndTry teda ked vratilo chybu presunulo sa z bloku dalej a udaje posielalo tam kam malo , ale je aj niaka rozumnejsia cesta ?

Dakujem za odpoved.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Parameter count mismatch znamená, že tam máte nějakou vlastnost, která je indexer, tedy vyžaduje parametry. Ošetřovat to přes Try Catch je pěkná prasárna, dělat by se to nemělo. Zjistěte, co je to za vlastnost, jaký má název a jak je deklarována.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

:) to sa mi asi tazko podari =) lebo som vam moc neporozumel... a preco je to prasarna osetrovat to cez try catch ? ved to niako nezmeni beh aplikacie akurat sa mozem hambit ze to newiem lepsie opravit . Ak sa mílim tak ma opravte.

Dakujem za odpoved.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to jako když tekoucí přehradu zalepíte žvýkačkou. Sice to nějak funguje, ale je to neefektivní (Try Catch zpomaluje) a neřeší to původní příčinu problému, ale jeho projevy.

Navíc to jde proti pravidlu, že výjimky nesmí maskovat chyby programátora.

Potíž je podle mě v tom, že objekt My.Settings má třeba nějakou vlastnost Potvora, která potřebuje parametry. Tzn. používá se třeba My.Settings.Potvora(15, "aa"). Nemyslím vlastnost typu pole, říká se tomu indexer. To by vysvětlovalo tu chybu.

Pošlete sem seznam vlastností, které v tom nastavení máte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dakujem za vasu ochotnost pri rieseni problemu :) tu su cele nastavenia aplikacie :

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
  <Profiles />
  <Settings>
    <Setting Name="upto_FTP_HOST" Type="System.String" Scope="User">
      <Value Profile="(Default)">ftp://ftp.*.cholerik.cz/Usersb/</Value>
    </Setting>
    <Setting Name="upto_FTP_USER" Type="System.String" Scope="User">
      <Value Profile="(Default)">*.cholerik.cz</Value>
    </Setting>
    <Setting Name="upto_FTP_PASS" Type="System.String" Scope="User">
      <Value Profile="(Default)">*</Value>
    </Setting>
    <Setting Name="upto_MAIL_USER" Type="System.String" Scope="User">
      <Value Profile="(Default)">*@gmail.com</Value>
    </Setting>
    <Setting Name="upto_MAIL_PASS" Type="System.String" Scope="User">
      <Value Profile="(Default)">*</Value>
    </Setting>
    <Setting Name="upto_MAIL_SMTP" Type="System.String" Scope="User">
      <Value Profile="(Default)">smtp.gmail.com</Value>
    </Setting>
    <Setting Name="upto_MAIL_PORT" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">587</Value>
    </Setting>
    <Setting Name="run_T1_KEYLOGGER" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">1</Value>
    </Setting>
    <Setting Name="run_T2_SCREENGRABBER" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="run_T3_or_T4_or_T12_or_T13UPLOAD_LOG" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">2</Value>
    </Setting>
    <Setting Name="run_T5_RUN_ON_STARTUP" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="run_T6_COMMAND_EXECUTION" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">1</Value>
    </Setting>
    <Setting Name="run_T7_MESSAGE_SPAM" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="run_THREAD_SHUTDOWN_HANDLER" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">1</Value>
    </Setting>
    <Setting Name="run_T9_SPEAKER" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="run_T10_BEEPER" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="interval_T6_COMMAND_EXECUTION" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">600000</Value>
    </Setting>
    <Setting Name="cache_ERROR" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    <Setting Name="cache_USERNAME" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    <Setting Name="cache_APPLICATION_RESTART" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="cache_INTERNET_ACCESS" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    <Setting Name="cache_GRAB_IP_URL_1" Type="System.String" Scope="User">
      <Value Profile="(Default)">http://checkip.dyndns.org/?rnd1=</Value>
    </Setting>
    <Setting Name="cache_GRAP_IP_URL_2" Type="System.String" Scope="User">
      <Value Profile="(Default)">http://www.whatismyip.com/automation/n09230945.asp</Value>
    </Setting>
    <Setting Name="run_IP_URL_GRAB_1" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="run_IP_URL_GRAB_2" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="cache_SPAMMER_MESSAGE" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    <Setting Name="run_CHECK_USERNAME" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">1</Value>
    </Setting>
    <Setting Name="upto_STATUS" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="cache_SPEAKER_MESSAGE" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    <Setting Name="run_AES_CRYPTOGRAPHY" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="cache_MD5_HASH_CRYPTOGRAPHY" Type="System.String" Scope="User">
      <Value Profile="(Default)">reloaded8</Value>
    </Setting>
    <Setting Name="use_EXTENSION" Type="System.String" Scope="User">
      <Value Profile="(Default)">.amt</Value>
    </Setting>
    <Setting Name="down_FTP_HOST" Type="System.String" Scope="User">
      <Value Profile="(Default)">http://*.cz/Usersb/</Value>
    </Setting>
    <Setting Name="run_T11_MOVE_WINDOWS" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="run_SOUND_SPAM" Type="System.Int32" Scope="User">
      <Value Profile="(Default)">0</Value>
    </Setting>
    <Setting Name="cache_SOUND_SPAM_PATH" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
  </Settings>
</SettingsFile>

je to neco ako backdoor takze sa nepytajte preco su tam take nastavenia ;) , ale nenazval by som to tak lebo je to skolsky projekt , ktory je len ukazkov toho co sa da spravit a robim ho preto ze nas ucitel moc machroval ze nieco take je nemozne :)

niektore miesta su vyplnene hviezdickov a to cesty na ftp server pre stahovanie prikazov a uploadovanie odpovedi...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

a este malu otazocku , to s tim try catch ze spomaluje to myslite vazne ? a spomaluje to celkovo aj ked sa nestane chyba alebo iba pri to catch ked nastane chyba ? lebo celu aplikaciu mam stavanu na bloku try catch :\ .

Je niaka lepsia varianta ? lebo poznam este On Error Goto ale to sa mi nezda moc dobre lebo ked mam viac blokov tak mozem presnejsie identifikovat chybu a da sa aj vypisat chybu ako ju okomentoval framework a u On Error Goto iba prejde na urcity riadok nizsie

On Error Goto A:
'niaky kod

Return
A:
MsgBox("Nastala chyba")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vstoupení do Try..Catch bloku něco stojí, není to nijak dramatické, ale rozhodně není rozumné řešit výjimkami věci, které jdou rozumně udělat bez nich.

On Error Goto rozhodně nepoužívejte, je to zastaralá konstrukce ze starého VB a bude určitě ještě pomalejší. Hlavně je hrozně nepřehledná a nesystémová.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Asi tak :).. a akou cestou sa da riesit vychytanie chyb ? jedine na 100% spravnim kodom nie ? =) , mne by to ani nevadilo keby napriklad zobrazilo normalnu hlasku napriklad v rohu aplikacie ale ked framework vyhodi mega chybovu hlasku s poklkou zdrojaku =D ..

Ak mozem vediet ako vy riesite chyby v zdrojovom kode ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem se konečně dokopal k tomu spustit VB a zjistil jsem, že není třeba používat Reflection. K My.Settings se dá přistupovat i jako ke kolekci.

        'projde všechny vlastnosti
        For Each p As SettingsProperty In My.Settings.Properties
            Console.WriteLine(p.Name)  'vypíše název vlastnosti
            Console.WriteLine(My.Settings(p.Name))  'vypíše hodnotu
        Next
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musim povedat ze je to excelentny kod dakujem velmi pekne.

PS: este ste zabudli ze treba dat :

Imports System.Configuration

lebo SettingsProperty bez toho nieje deklarovana. Este raz dakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback