Niedziałający kod do "odgadywania hasła"

Niedziałający kod do "odgadywania hasła"
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0

Witam
Piszę program który odgaduje ciąg znaków litera po literze i wyświetla go textboxie. Niestety napotkałem problem, mianowicie gdy klikam przycisk program wyświetla pojedynczą literę a nie całe hasło. Dodam także że do całej procedury używam bacgroundworkera. Po niżej zamieszczam kod. Z góry dziękuje za pomoc.

Kopiuj
public Form1()
{
                   InitializeComponent();                   
            backgroundWorker1 = new BackgroundWorker();
            //     backgroundWorker1.WorkerReportsProgress = true; 
           backgroundWorker1.WorkerSupportsCancellation = true;
            backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
            backgroundWorker1.RunWorkerCompleted += BackgroundWorker1_RunWorkerCompleted;        
            haslo = textBox2.Text;
}

    BackgroundWorker backgroundWorker1;
    int index = 0;
    int i = 0;
    string litery = "ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz";
    string haslo;
  
    private void BackgroundWorker1_DoWork(object? sender, DoWorkEventArgs e)
        {
                for (int i = 0; i < litery.Length - 1; i++)
                {
                    if (!backgroundWorker1.CancellationPending)
                    {
                        try
                        {
                            this.Invoke((Action)delegate
                                        {       
                                            if (textBox1.Text=="")
                                            {
                                                index = 0;
                                            }
                                         
                                                while (litery[i] == textBox2.Text[index] && textBox1.Text.Length >= index - 1)                                       
                                                    {                                                                                                        
                                                        if (textBox1.Text.Length - 1 <= index)
                                                        {
                                                          
                                                            backgroundWorker1.CancelAsync();
                                                            index++;
                                                            textBox1.Text += litery[i].ToString();
                                                            textBox1.Select(index, textBox1.Text.Length - 1);

                                                            if (!backgroundWorker1.IsBusy)
                                                            {
                                                                backgroundWorker1.RunWorkerAsync();
                                                             
                                                            }
                                                        }
                                                     
                                                        else
                                                        {
                                                        //    break;
                                                    
                                                        }
                                                 }

                                            
                                        });
                        }
                        catch
                        {
                            break;
                        }
                    }                    
                } 
              
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            // Start odgadywania
            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {        
            // Zatrzymywanie odgadywania
            if (backgroundWorker1.IsBusy)
            {
                backgroundWorker1.CancelAsync();
                i = -1;
            }
        }

edytowany 7x, ostatnio: kuba7528
Reinicke
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:18
0

Opisz co dokładnie chcesz osiągnąć, jak ten program ma działać, najlepiej krok po kroku, na razie jest to średnio zrozumiałe.
Ten kod czyta się okropnie, poświęć kilka minut i usuń niepotrzebne komentarze i puste linie, pokaż jak deklarujesz i inicjalizujesz zmienne, nikt nie ma ochoty się tego domyślać.


Si non confectus, non reficiat.
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0
Reinicke napisał(a):

Opisz co dokładnie chcesz osiągnąć, jak ten program ma działać, najlepiej krok po kroku, na razie jest to średnio zrozumiałe.
Ten kod czyta się okropnie, poświęć kilka minut i usuń niepotrzebne komentarze i puste linie, pokaż jak deklarujesz i inicjalizujesz zmienne, nikt nie ma ochoty się tego domyślać.

Chcę aby program po kliknięciu w przycisk porównał ciąg znaków z obydwu textboxów. Po sprawdzeniu czy znak jest w haśle na danym indeksie wyświetlił go w pierwszym textboxie i tak do końca długości hasła. Mam nadzieję że napisałem zrozumiale.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Podziel na male funkcji, inaczej tego nie przejdziesz.
Przecież to nawet nie ma prawa się skompilować, kompilator na 100% pokazuje gdzie jest problem.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0

Nie bardzo wiem jak miałbym to podzielić na funkcje. Co do kompilacji to program kompiluje się bez błędów.

IA
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:40
0

Czyta się to fatalnie ale próbując jakoś się w tym cudzie połapać to chyba próbujesz wypisywać litery do text boxa tylko kiedy i jest mniejsze bądź równe index, a taka sytuacja zajdzie raz. I to by się zgadzało. Aczkolwiek jak koledzy wyżej wspomnieli - weź ten kod ogarnij trochę, posprzątaj, podziel sensownie bo oczy bolą

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
kuba7528 napisał(a):

Nie bardzo wiem jak miałbym to podzielić na funkcje. Co do kompilacji to program kompiluje się bez błędów.

Kopiuj
while (litery[i] == textBox2.Text[index])
                                             textBox2.Text[index]&&textBox1.Text.Length>=index-1)
                                                    {

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0

Niestety nie działa mi porównywanie znaków przepuszczone przez for. Jak mam porównać literę i jej pozycję w stringach ?

MM
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:5
1

nie bardzo mogę załapać co chcesz osiągnąć.
Twój opis problemu jest niespójny z kodem, z którego to też nie można wywnioskować logiki.
Piszesz że porównujesz txtbox1 i txtbox2 a w txtbox1 chcesz coś wpisywać ? dla mnie bez sensu to brzmi.
A co z tym ciągiem literek,, po co on?
czy to czasami nie ma być coś w rodzaju gry w wisielca?
czy asynchroniczność ma jakiś ukryty sens, bo też tego nie łapię, po co?

edytowany 1x, ostatnio: master_mix
Reinicke
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:18
0
kuba7528 napisał(a):

Chcę aby program po kliknięciu w przycisk porównał ciąg znaków z obydwu textboxów. Po sprawdzeniu czy znak jest w haśle na danym indeksie wyświetlił go w pierwszym textboxie i tak do końca długości hasła. Mam nadzieję że napisałem zrozumiale.

Ok, chyba załapałem o co Ci chodzi. Masz 2 textboxy(textBox1, textBox2), w obu jest wpisany tekst, po wciśnięciu button1 odpalasz backgroundWorker1, który porównuje tekst z obu textboxów i jeżeli jest taki sam to wpisuje go do textBox1(w którym ten tekst już jest wpisany). Żeby było "prościej" porównujesz litera po literze, używasz do tego globalnej zmiennej index i stringa litery z zapisanym całym alfabetem, dla każdej litery najpierw sprawdzasz czy występuje ona w alfabecie, jeżeli tak to szukasz jej w tekście w textBox2. Jeżeli znajdziesz to wpadasz w nieskończoną pętle(// break;) i dlatego masz przycisk button2, który zatrzymuje backgroundWorker1. Do tego są jeszcze globalne zmienne haslo i i, które nie są używane. I wywołanie rekurencyjne w 45 linii backgroundWorker1.RunWorkerAsync();, bo czemu nie. Dobrze zrozumiałem?


Si non confectus, non reficiat.
edytowany 1x, ostatnio: Reinicke
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0

Ten ciąg znaków służy do porównywania w pętli z hasłem w textbox2.W grze w wisielca porównuje się jeden znak w dodatku nie musi o mieć zerowego indeksu. Ja chcę porównać od początku do końca hasła z literą z alfabetu i sprawdzić jej pozycję, czy zgadza się z pozycją hasła. Co do "hasla" i "i" to chciałem przypisać "haslo" do texbox2 a "i" wykorzystać jako indeks poszczególnej litery w tym texboxie2.

K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0
Reinicke napisał(a):
kuba7528 napisał(a):

Chcę aby program po kliknięciu w przycisk porównał ciąg znaków z obydwu textboxów. Po sprawdzeniu czy znak jest w haśle na danym indeksie wyświetlił go w pierwszym textboxie i tak do końca długości hasła. Mam nadzieję że napisałem zrozumiale.

Ok, chyba załapałem o co Ci chodzi. Masz 2 textboxy(textBox1, textBox2), w obu jest wpisany tekst, po wciśnięciu button1 odpalasz backgroundWorker1, który porównuje tekst z obu textboxów i jeżeli jest taki sam to wpisuje go do textBox1(w którym ten tekst już jest wpisany). Żeby było "prościej" porównujesz litera po literze, używasz do tego globalnej zmiennej index i stringa litery z zapisanym całym alfabetem, dla każdej litery najpierw sprawdzasz czy występuje ona w alfabecie, jeżeli tak to szukasz jej w tekście w textBox2. Jeżeli znajdziesz to wpadasz w nieskończoną pętle(// break;) i dlatego masz przycisk button2, który zatrzymuje backgroundWorker1. Do tego są jeszcze globalne zmienne haslo i i, które nie są używane. I wywołanie rekurencyjne w 45 linii backgroundWorker1.RunWorkerAsync();, bo czemu nie. Dobrze zrozumiałem?

Tak, dobrze kolega zrozumiał.
Ten ciąg znaków służy do porównywania w pętli z hasłem w textbox2.W grze w wisielca porównuje się jeden znak w dodatku nie musi o mieć zerowego indeksu. Ja chcę porównać od początku do końca hasła z literą z alfabetu i sprawdzić jej pozycję, czy zgadza się z pozycją hasła. Co do "hasla" i "i" to chciałem przypisać "haslo" do texbox2 a "i" wykorzystać jako indeks poszczególnej litery w tym texboxie2.

Reinicke
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:18
0

Źle się za to zabierasz, najpierw pomyśl jak to ma działać, ułóż sobie plan i dopiero wtedy zacznij kodować. Może zacznij od czegoś takiego:

  1. String do przechowywania odpowiedzi i label do wyświetlania "_ a _ _ _ a".
  2. String do przechowywania hasła, na start niech będzie hardcodowane
  3. TextBox do wpisywania odpowiedzi, najlepiej jakby można było wpisać do niego tylko jedną literę, powinien być czyszczony po każdym sprawdzeniu, żeby przygotować go do wpisania następnego znaku.
  4. Sprawdzanie najlepiej odpalać w TextChanged textBoxa, ewentualnie dodać button, jeżeli koniecznie chcesz mieć to na click.
  5. Nie potrzebujesz żadnego stringa z alfabetem, bakcgroundworkera ani rekurencji. Całe sprawdzanie można zrobić w jednej pętli, pętla leci po haśle, jeżeli znajdzie wpisaną literę to aktualizuje string z odpowiedzią i tekst labelki. Tyle wystarczy.
  6. Jak już wszystko będzie działało to można dodać losowe hasło, historię odpowiedzi, maksymalną ilość błędnych odpowiedzi itp.

Czyli na widoku wystarczy że będziesz miał jeden label, jeden textbox i ewentualnie jeden button. W code behind zmienne na hasło i odpowiedz oraz metoda do sprawdzania liter.


Si non confectus, non reficiat.
Reinicke
sposobów na to jest multum, pętle wydały mi się najprostsze do zrozumienia dla kogoś na tym etapie, zwłaszcza że tak lubi ich używać
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0
Reinicke napisał(a):

Źle się za to zabierasz, najpierw pomyśl jak to ma działać, ułóż sobie plan i dopiero wtedy zacznij kodować. Może zacznij od czegoś takiego:

Dokładnie.

Szycie algorytmów żywcem na GUI, nie wiadomo po co tryby asynchroniczne itd ...

@kuba7528:

Mocno uproszczona interpunkcja, i styl pisania w języku jakiego używasz, klon polskiego, nie podnosi twojego rankingu w oczach czytających.
Chaos w myślach, chaos w kodzie.
Tak, wiem, zaraz mnie zakrzyczą politycznie poprawni:"z dysgrafią można być dobrym programistą" ... no cóż, ten wątek mnie do tego nie przeokna.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
Kopiuj
private static int maxerror=7;
private string used="";
private string password="przeokna";
private string current=string('_',password.length);
private int errors=0;
public static enum state { NotLitter,Used,Good,Bad,Win,Loose; };

public string Current { get { return current; } }
public int Errors { get { return error; } }

public state checkLetter(char ch)
{
  if(!Char.IsDigit()) return state.NotLitter;
  ch=Char.ToLower(ch);
  if(used.Contains(ch)) return state.Used;
  used+=ch;
  string temp=current;
  for(int i=0;i<password.length;++i) if(password[i]==ch) temp[i]=ch;
  if(current!=temp) return (password==(current=temp)?state.Win:state.Good);
  else return (++errors>=maxerror?state.Loose:state.Bad);
}

Uwaga, pisano na kolanie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0
ZrobieDobrze napisał(a):
Reinicke napisał(a):

Źle się za to zabierasz, najpierw pomyśl jak to ma działać, ułóż sobie plan i dopiero wtedy zacznij kodować. Może zacznij od czegoś takiego:

Dokładnie.

Szycie algorytmów żywcem na GUI, nie wiadomo po co tryby asynchroniczne itd ...

@kuba7528:

Mocno uproszczona interpunkcja, i styl pisania w języku jakiego używasz, klon polskiego, nie podnosi twojego rankingu w oczach czytających.
Chaos w myślach, chaos w kodzie.
Tak, wiem, zaraz mnie zakrzyczą politycznie poprawni:"z dysgrafią można być dobrym programistą" ... no cóż, ten wątek mnie do tego nie przeokna.

Ogarnąłem to. Niestety obsługuje tylko krótkie hasła (program przywiesza się przy dłuższych ) , gdy próbuje to wrzucić do bagroundworkera program nie działa. Podobno dysleksja to nie choroba, jednakże udało mi się coś napisać. Poniżej zamieszczam moje wypociny. Sprawdzę sobie także na spokoje kod od _13th_Dragon za który dziękuje.

Kopiuj
  string haslo;
        public void Odgadnij_haslo()
        {
            haslo = textBox1.Text;
            //   odp = label1.Text;


            
                for (int i = 0; i <= haslo.Length - 1; i++)
                {
                    // for (char letter = 'a'; letter <= 'z'; letter++)
                    for (int x = char.MinValue; x <= char.MaxValue; x++)
                    {
                        char letter = Convert.ToChar(x);
                        textBox2.Text = letter.ToString();
                        if (haslo[i].ToString() == letter.ToString() && char.IsLetterOrDigit(letter))
                        {
                            label1.Text += textBox2.Text;

                        }


                        //    textBox2.Text = "";


                    }

                }
            
        }

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
kuba7528 napisał(a):

Ogarnąłem to.

Nadal jest totalny bezsens, może napisz komentarze do każdego wiersz co twoim zdaniem ten wiersz robi.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0
Kopiuj

  string haslo; // deklaracja zmiennej haslo typu string
        public void Odgadnij_haslo()
        {
        // przypisanie hasla do texboxa
                     haslo = textBox1.Text;
       


            // przepuszczenie int'a przez długość hasła w celu późniejszego porównania znaku z jakimkolwiek znakiem z drugiej pętli  
                for (int i = 0; i <= haslo.Length - 1; i++)
                {
                   // tu może być problem bo wziąłem pewnie za duży zakres pod uwagę.
                   // pętla for przepuszczenie int'a przez wszystkie char'y.
                    for (int x = char.MinValue; x <= char.MaxValue; x++)
                    {
                    // deklaracja char i przypisanie do niego x
                        char letter = Convert.ToChar(x);
                        // wyświetlenie w texboxie char lettter
                        textBox2.Text = letter.ToString();

                        // sprawdzenie czy znak w haśle jest równy znakowi w z pętli for i czy jest on literą lub liczbą
                        if (haslo[i].ToString() == letter.ToString() && char.IsLetterOrDigit(letter))
                        {
                        // dodanie litery z texboxa2 do labela
                        // dodam że żadna litera nie wyświetla się w textbox2
                            label1.Text += textBox2.Text;

                        }


                 


                    }

                }
            
        }


Jeżeli moje komentarze są nie zrozumiałe to proszę o wyrozumiałość.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
  • pętla for przepuszczenie int'a przez wszystkie char'y. po kiego ci ta druga pętla jak możesz pobrać znak z pozycji i (char letter = haslo[i])?
  • deklaracja char i przypisanie do niego x jak wyżej
  • wyświetlenie w texboxie char lettter po kiego? Właśnie użytkownik ma podać tą literę a nie ty wyświetlać.
  • ... i czy jest on literą lub liczbą człowieku, czy znasz różnicę pomiędzy liczbą a cyfrą? A co jeżeli to np znak zapytania?
  • sprawdzenie czy znak w haśle jest równy znakowi w z pętli to po kiego aby porównać znak ze znakiem najpierw konwertujesz je do napisu?
  • dodanie litery z texboxa2 do labela po prostu na końcu? niezależnie gdzie i ile razy wystąpiła? Czyli jak litera a wystąpi na 3-cim i 5-tym miejscu to zwyczajnie dodasz dwie a na początku?

Dodatkowo:
http://forum.4programmers.net/1101404
http://forum.4programmers.net/1208091


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Reinicke
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:18
1

To nawet nie jest kwestia tego że nie wiesz jak coś zrobić, z Twojego kodu i wypowiedzi wynika że nie wiesz co chcesz zrobić. Może najpierw ułożymy konkretny scenariusz, krok po kroku:

  1. Wpisujemy literę w textBox1
  2. Wciskamy button1
  3. Jeżeli hasło zawiera podaną literę to program aktualizuje tekst w label1, odkrywając wpisaną literę na odpowiednich miejscach.
  4. Tekst w textBox1 jest czyszczony, powtarzamy kroki 1-4 aż nie odgadniemy całego hasła

Jak już pisałem, do samego sprawdzania podanej litery wystarczy Ci jedna pętla:

Kopiuj
        string password = "haslo";
        StringBuilder resultSB = new StringBuilder("-----");

        public void Odgadnij_haslo(char letterToCheck)
        {
            for (int i = 0; i < password.Length; i++)
            {
                if (password[i] == letterToCheck)
                {
                    resultSB[i] = letterToCheck;
                }
            }
        }

StringBuilder zamiast string żeby móc łatwo podmieniać litery.
Na button click wywołujesz Odgadnij_haslo, aktualizujesz tekst w label1 używając resultSB.ToString() i na koniec czyścisz tekst w textBox1. Dodaj jeszcze zabezpieczenie przed pustym tekstem w textBox1, zmodyfikuj metodę Odgadnij_haslo żeby nie rozróżniała małych i wielkich liter i gotowe.


Si non confectus, non reficiat.
_13th_Dragon
@Reinicke, czemu string nie wystarcza że musisz StringBuilder'a używać?
Reinicke
string.Remove i string.Insert też wystarczy, zapis z StringBuilder wydał mi się czytelniejszy
_13th_Dragon
Że jak? remove+insert zamiast stringSB[i]=? Za dużo pracy na dziś czy nieprzespana noc czy za dużo grzybków?
MM
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:5
1
Reinicke napisał(a):

To nawet nie jest kwestia tego że nie wiesz jak coś zrobić, z Twojego kodu i wypowiedzi wynika że nie wiesz co chcesz zrobić.

Coś mi się wydaje że kolega kuba7258, wie co chce zrobić, tylko nie chce głośno powiedzieć.
Obstawiam że to ma być "mechanizm" Do łamania haseł
Ale to nie tędy droga i to nie ma sensu.
Lepiej hasło ukraść 😁

edytowany 1x, ostatnio: master_mix
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0
master_mix napisał(a):
Reinicke napisał(a):

To nawet nie jest kwestia tego że nie wiesz jak coś zrobić, z Twojego kodu i wypowiedzi wynika że nie wiesz co chcesz zrobić.

Coś mi się wydaje że kolega kuba7258, wie co chce zrobić, tylko nie chce głośno powiedzieć.
Obstawiam że to ma być "mechanizm" Do łamania haseł
Ale to nie tędy droga i to nie ma sensu.
Lepiej hasło ukraść 😁

Dokładnie tak. Kradzież hasła z niezaszyfrowanego stringa, ciekawe. To ma być prosty program do łamania hasła znak po znaku. Nie jestem jakimś tam zaawansowanym programistą żeby wiedzieć wszystko. Programowanie to jedynie moje hobby stąd też wynika kiepskiej jakości kod. Jeśli chodzi o samo podejście do programu to nie programuje zbyt często i być może stąd nie mam nawyku analizowania kodu punkt punkcie.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1
kuba7528 napisał(a):

... To ma być prosty program do łamania hasła znak po znaku ...

Naoglądałeś się kiepskich seriali? Tylko tam jakieś super sekretne urządzenie "lamie kod" znak po znaku.
Z tym że wszędzie tam gdzie jest potrzebny taki kod/hasło nie ma możliwości sprawdzenia czy znak na pozycji X to Y, więc takie buty tylko w kiepskich serialach.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
K7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:87
0
_13th_Dragon napisał(a):
kuba7528 napisał(a):

... To ma być prosty program do łamania hasła znak po znaku ...

Naoglądałeś się kiepskich seriali? Tylko tam jakieś super sekretne urządzenie "lamie kod" znak po znaku.
Z tym że wszędzie tam gdzie jest potrzebny taki kod/hasło nie ma możliwości sprawdzenia czy znak na pozycji X to Y, więc takie buty tylko w kiepskich serialach.

Myślałem że to prosta sprawa nie używając szyfrowania. Dlatego na początku chciałem spróbować na haśle jawnym.

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)