FindComponent i Access Violation

FindComponent i Access Violation
LA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:17
0

Witam,
W pętli for (gdzie inkrementowana zmienna to i) mam taki oto kod:

Kopiuj
TempCombo := TComboBox(FindComponent('ComboBox' + IntToStr(i)));
TempCombo.ItemIndex := i;

Podczas uruchomienia programu debugger wywala błąd:
'access violation at 0x0083aa8f: read of address 0x00000000'
Zdaję sobie sprawę, że tego typu crash jest zazwyczaj spowodowany odwołaniem się do obszaru pamięci do której nie mamy w danym momencie prawa się odwoływać, poprzez np. odwołania do nie istniejących jeszcze tworzonych dynamicznie obiektów itp. Tutaj natomiast TempCombo jest tworzony wcześniej dynamicznie (lub też nawet gdy jest na sztywno wrzucony na formę dalej jest problem). A i najważniejsze błąd wyskakuje dopiero przy drugiej linijce tj. gdzie ustawiane jest ItemIndex. Why?

xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Bo funkcja FindComponent prawdopodobnie nie znalazła takiego komponentu i zwróciła adres 0x0, więc przypisałeś TempCombo adres 0x0, potem chcesz odwołać się do tej kontrolki no to wiesz co się stanie. I to czy TempCombo było wcześniej utworzone czy nie, nie ma tutaj znaczenia, bo ty ponownie przypisujesz.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

U mnie kod działa.
Na pewno masz komponent o odpowiedniej nazwie na formie?
Tak jak powiedział @xeo545x39 - AV możesz dostać, gdy komponent nie zostaje odnaleziony.

A i najważniejsze błąd wyskakuje dopiero przy drugiej linijce tj. gdzie ustawiane jest ItemIndex. Why?

Jeżeli FindComponent zwróciło nil, TempCombo także będzie wskazywać na nil (nil = Pointer(0)).
Odczytujesz/zapisujesz zawartość pamięci znajdującą się pod adresem Pointer(0), przez co otrzymujesz AV.


edytowany 4x, ostatnio: Patryk27
LA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:17
0
Patryk27 napisał(a):

U mnie kod działa.
Na pewno masz komponent o odpowiedniej nazwie na formie?
Tak jak powiedział @xeo545x39 - AV możesz dostać, gdy komponent nie zostaje odnaleziony.

Komponent ComboBox1 na pewno jest na formie, podejrzewam, że problemem może być to, iż nie jest on na niej umiejscowiony bezpośrednio, a jest zaszyty "głębiej" tj. Form.PageControl.TabSheet.GroupBox . W jaki sposób mogę sprawdzić co znalazła metoda FindComponent?

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

W jaki sposób mogę sprawdzić co znalazła metoda FindComponent?

FindComponent zwraca TComponent.
Wystarczy sprawdzić, czy nie zwróciło nil (służy do tego funkcja assigned).
Jeżeli Assigned(wynik funkcji) = true, wtedy możesz operować na tym komponencie (czyli został on odnaleziony).

podejrzewam, że problemem może być to, iż nie jest on na niej umiejscowiony bezpośrednio, a jest zaszyty "głębiej" tj. Form.PageControl.TabSheet.GroupBox

U mnie pomimo tego, komponent jest wykrywany (Delphi 7).


edytowany 1x, ostatnio: Patryk27
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

Bezpieczniejszy kod powinien wyglądqać tak:

Kopiuj
var
  TempCombo: TComponent;
  i: Integer;
begin
  //tu gdzies nadac i wartosc 
  TempCombo:= FindComponent('ComboBox' + IntToStr(i));
  if {Assigned(TempCombo) and} (TempCombo is TComboBox) then //sprawdzenie Assigned niepotrzebne bo ten kod sprawdzi czy nie nil
  begin
    TComboBox(TempCombo).ItemIndex:= i;
    //tu jakies inne operacja
  end;
end;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
LA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:17
0

Faktycznie,

Kopiuj
if Assigned(TempCombo)  then

zwraca FALSE

Kopiuj
, może to jednak kwestia tego głębszego zaszycia?
Patryk27
Problem może być, jeżeli tworzysz zakładki i komponenty dynamicznie, ale nie jestem pewien.
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0
Lakshmi napisał(a):

może to jednak kwestia tego głębszego zaszycia?
Nie FindComponent (w przeciwieństwie do FindControl które wyszukuje tylko kontrolki potomne danego rodzica) działa globalnie na całą Formę (nie na projekt).

Sprawdź czy na pewno i ma nadaną odpowiednią wartość.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
0

Wystarczy sprawdzić, czy nie zwróciło nil (służy do tego funkcja assigned).
Jeżeli Assigned(wynik funkcji) = true, wtedy możesz operować na tym komponencie (czyli został on odnaleziony).

Może i się czepiam ale można debuggerem podejrzeć wartość TempCombo (Ctrl+F7 w Lazarusie) zamiast mieszać sobie w kodzie. Zaawansowane techniki debuggerskie FTW.

może to jednak kwestia tego głębszego zaszycia?

Może pokaż więcej kodu. Nie wróżymy z fusów.

LA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:17
0

Na pewno ComboBox1 jest na formie i ma taką nazwę (zresztą są comboboxy o nazwach od combobox1 do combobox8). Najlepsze jest to, że niżej w kodzie wykonuję operacje wykorzystując FindComponent i działa ok. Niżej cała procedurka, bo już mi pomysły się kończą...

Kopiuj
procedure TForm1.UstawWyswietlaneWilg;
var
  INIwilgotnosci          : TINIFile;
  sKoks                   : String;
  i,j,iIloscKoksowWBazie  : Byte;
  oDBComboBox             : TDBComboBox;
  dzien                   : TDate;
  Listakoksow             : TStringList;
  ComboBox, TempCombo     : TComboBox;
begin
  if not FileExists(ExtractFilePath(Application.ExeName) + 'RapRob\Wilgotnosci.ini') then begin
    try
      INIwilgotnosci := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'RapRob\Wilgotnosci.ini');
    except
      on E:Exception do begin
        komunikat := 'Błąd utworzenia nowego pliku INI z ustawieniami początkowymi wyśliwetlanych wilgotności koksów';
        WstawKomunikat;
        ZapiszKomunikat;
         { TODO : Dorobić obsługę wyświetlania nazw wilgotności koksów w przypadku błędu utworzenia pliku INI }
      end;
    end;

    with DataModule1.dbqRzMat do begin
      if Active = TRUE then
        Close;

      Sql.Clear;
      Sql.Add('SELECT nazwa FROM dbo.bf_rapzm_mat ');
      Sql.Add('WHERE kod_stos = ''K'' ');
      Sql.Add('ORDER BY nazwa');
      Open;
      iIloscKoksowWBazie := RecordCount;

      //Utworzenie sekcji 'Koksy' w pliku INI (alfabetyczny spis koksów istniejących w bazie)
      First;
      Listakoksow := TStringList.Create();
      for i := 1 to iIloscKoksowWBazie do begin
        sKoks := FieldByName('nazwa').AsString;
        ListaKoksow.Add('sKoks');
        INIwilgotnosci.WriteString('Koksy', 'Koks' + IntToStr(i), sKoks);
        Next;
      end;

      //Utworzenie sekcji 'Wybrane' w pliku INI
      TempCombo := TComboBox.Create(nil);
      for i := 1 to 8 do begin
        INIwilgotnosci.WriteString('Wybrane', IntToStr(i), IntToStr(i));
//        TComboBox(FindComponent('ComboBox' + IntToStr(i))).ItemIndex := i;

        TempCombo   := TComboBox(FindComponent('ComboBox' + IntToStr(i)));
//        ComboBox.Items      := Listakoksow;
        if Assigned(TempCombo) then
          TempCombo.ItemIndex  := i;
      end;

      ListaKoksow.Free;
      Close;
    end;
  end else begin  //plik INI już istnieje
    INIwilgotnosci := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'RapRob\Wilgotnosci.ini');
    try
      for i := 1 to 8 do begin
        sKoks := INIwilgotnosci.ReadString('Main', 'Koks' + IntToStr(i), 'Koks' + IntToStr(i));
//        TDBComboBox(FindComponent('DBComboBox1' + IntToStr(i))).Text := sKoks;
        TComboBox(FindComponent('ComboBox' + IntToStr(i))).Text := sKoks;
//        TComboBox(FindComponent('ComboBox' + IntToStr(i))).ItemIndex := 2;
      end;
    finally
      INIwilgotnosci.Free;
    end;
  end;

  WstawDatyDoStringGridDatyWilg(Date);
end;
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

Zmień:

Kopiuj
TempCombo := TComboBox.Create(nil);

na:

Kopiuj
TempCombo := TComboBox.Create(Form1);

A zresztą co to jest? Ta pętla tworzy 1 ComboBox

Kopiuj
      //Utworzenie sekcji 'Wybrane' w pliku INI
      TempCombo := TComboBox.Create(nil);
      for i := 1 to 8 do begin
        INIwilgotnosci.WriteString('Wybrane', IntToStr(i), IntToStr(i));
//        TComboBox(FindComponent('ComboBox' + IntToStr(i))).ItemIndex := i;
 
        TempCombo   := TComboBox(FindComponent('ComboBox' + IntToStr(i)));
//        ComboBox.Items      := Listakoksow;
        if Assigned(TempCombo) then
          TempCombo.ItemIndex  := i;
      end;

Nie wiem co to ma być ale skoro komponenty ComboBox są położone na formie (czy tam na jakimś panelu czy nie wiadomo czym) to po co:

Kopiuj
TempCombo := TComboBox.Create(nil);

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 2x, ostatnio: kAzek
0

TempCombo := TComboBox.Create(nil);

Bo?

kAzek napisał(a):

Zmień:

Kopiuj
TempCombo := TComboBox.Create(nil);

na:

Kopiuj
TempCombo := TComboBox.Create(Form1);

Po co tworzyć nowy TempCombo?!?! Przecież i tak traci referencję do niego.

Może jakbyś pokazał to jak wygląda deklaracja TForm1 to byśmy wreszcie wiedzieli jak wyglądają te comboboxy.
Możesz też zamiast FindComponent użyć zwykłej tablicy z kolejnymi ComboBox, proste i działa.

KA
Poprawiłem sie w pierwszej chwili nie zauważyłem co on w ogóle kombinuje.
LA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:17
0

Deklaracja TForm1, UWAGA trochę przydługawa :) :

Kopiuj
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    StatusBar1: TStatusBar;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    Panel3: TPanel;
    GroupBox1: TGroupBox;
    StringGrid1: TStringGrid;
    Shape2: TShape;
    Shape3: TShape;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Shape4: TShape;
    Shape5: TShape;
    Label4: TLabel;
    Label5: TLabel;
    ColorDialog1: TColorDialog;
    StringGrid3: TStringGrid;
    StringGrid2: TStringGrid;
    Shape6: TShape;
    Shape7: TShape;
    Shape8: TShape;
    Shape9: TShape;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Shape10: TShape;
    Label10: TLabel;
    Panel4: TPanel;
    Panel5: TPanel;
    Label13: TLabel;
    Label14: TLabel;
    Shape11: TShape;
    GroupBox2: TGroupBox;
    Label16: TLabel;
    GroupBox4: TGroupBox;
    GroupBox3: TGroupBox;
    Shape14: TShape;
    StringGrid9: TStringGrid;
    StringGrid10: TStringGrid;
    Label17: TLabel;
    StringGrid11: TStringGrid;
    StringGrid13: TStringGrid;
    StringGrid14: TStringGrid;
    StringGrid15: TStringGrid;
    StringGrid16: TStringGrid;
    StringGrid17: TStringGrid;
    StringGrid18: TStringGrid;
    Shape15: TShape;
    Shape16: TShape;
    Shape17: TShape;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Shape18: TShape;
    Label21: TLabel;
    Shape19: TShape;
    Label22: TLabel;
    Shape20: TShape;
    Label23: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label24: TLabel;
    Shape23: TShape;
    Label26: TLabel;
    Shape24: TShape;
    Label27: TLabel;
    Shape25: TShape;
    Label28: TLabel;
    Shape28: TShape;
    Label31: TLabel;
    Shape29: TShape;
    Label32: TLabel;
    Edit7: TEdit;
    Panel6: TPanel;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    Label33: TLabel;
    Label34: TLabel;
    Label35: TLabel;
    Label36: TLabel;
    Label37: TLabel;
    Label38: TLabel;
    Shape30: TShape;
    Label39: TLabel;
    Shape31: TShape;
    Label40: TLabel;
    GroupBox7: TGroupBox;
    Shape32: TShape;
    Label41: TLabel;
    Shape33: TShape;
    Label42: TLabel;
    Shape34: TShape;
    Label43: TLabel;
    Shape35: TShape;
    Label44: TLabel;
    Shape36: TShape;
    Label49: TLabel;
    DBGrid1: TDBGrid;
    SpinEdit2: TSpinEdit;
    ListBox1: TListBox;
    SpinEdit4: TSpinEdit;
    DBGrid3: TDBGrid;
    RichEdit1: TRichEdit;
    StringGrid12: TStringGrid;
    DBGrid2: TDBGrid;
    Label50: TLabel;
    SaveDialog1: TSaveDialog;
    QRTextFilter1: TQRTextFilter;
    GroupBox8: TGroupBox;
    DateTimePicker1: TDateTimePicker;
    SpinEdit1: TSpinEdit;
    TimerPom: TTimer;
    TimerSpuSpi: TTimer;
    TimerKaty: TTimer;
    TimerCzas: TTimer;
    MainMenu1: TMainMenu;
    Aktywacja1: TMenuItem;
    Wymiana1: TMenuItem;
    Przegladanie1: TMenuItem;
    Uruchom1: TMenuItem;
    Aktualizuj1: TMenuItem;
    Koniec1: TMenuItem;
    Popzmiana1: TMenuItem;
    Dowolnazmiana1: TMenuItem;
    Podgldraportu1: TMenuItem;
    Drukuj1stron1: TMenuItem;
    Drukuj2stron1: TMenuItem;
    Zamknijraport1: TMenuItem;
    Biezmiana1: TMenuItem;
    OpenDialog1: TOpenDialog;
    Nastzmiana1: TMenuItem;
    SpinEdit6: TSpinEdit;
    Poczpostoju1: TMenuItem;
    Koniecpostoju1: TMenuItem;
    GroupBox9: TGroupBox;
    ListBox2: TListBox;
    TimerConect: TTimer;
    DBGrid4: TDBGrid;
    SpinEdit7: TSpinEdit;
    SpinEdit8: TSpinEdit;
    SpinEdit10: TSpinEdit;
    StartAbsolutny: TMenuItem;
    Kontynuacja: TMenuItem;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText3: TDBText;
    StringGrid4: TStringGrid;
    WstawPostoj: TBitBtn;
    Label56: TLabel;
    Label11: TLabel;
    Shape12: TShape;
    DBGrid5: TDBGrid;
    DBGrid6: TDBGrid;
    DBGrid7: TDBGrid;
    DBGrid8: TDBGrid;
    DBGrid9: TDBGrid;
    DBGrid12: TDBGrid;
    DBGrid13: TDBGrid;
    Shape13: TShape;
    Label12: TLabel;
    DBGrid14: TDBGrid;
    DBGrid10: TDBGrid;
    StringGrid25: TStringGrid;
    StringGrid26: TStringGrid;
    Shape26: TShape;
    Label15: TLabel;
    Shape27: TShape;
    Label29: TLabel;
    Shape37: TShape;
    Label30: TLabel;
    Shape38: TShape;
    Label54: TLabel;
    Shape39: TShape;
    Label55: TLabel;
    DBGrid15: TDBGrid;
    DBGrid16: TDBGrid;
    StringGrid28: TStringGrid;
    StringGrid29: TStringGrid;
    DBMemo1: TDBMemo;
    DBMemo2: TDBMemo;
    DBMemo3: TDBMemo;
    DBMemo4: TDBMemo;
    DBMemo5: TDBMemo;
    DBComboBox1: TDBComboBox;
    DBComboBox2: TDBComboBox;
    DBComboBox3: TDBComboBox;
    DBComboBox4: TDBComboBox;
    DBComboBox5: TDBComboBox;
    DBComboBox6: TDBComboBox;
    DBComboBox7: TDBComboBox;
    DBComboBox8: TDBComboBox;
    DBComboBox9: TDBComboBox;
    DBComboBox10: TDBComboBox;
    UsunPostoj: TBitBtn;
    ZapiszPostoj: TBitBtn;
    WstawAnalSp: TBitBtn;
    ZapiszAnalSp: TBitBtn;
    UsunAnalSp: TBitBtn;
    WstawSitSp: TBitBtn;
    ZapiszSitSp: TBitBtn;
    UsunSitSp: TBitBtn;
    WstawSitKok: TBitBtn;
    ZapiszSitKok: TBitBtn;
    UsunSitKok: TBitBtn;
    WstawAnalKk: TBitBtn;
    ZapiszAnalKk: TBitBtn;
    UsunAnalKk: TBitBtn;
    WstawPyl: TBitBtn;
    ZapiszPyl: TBitBtn;
    UsunPyl: TBitBtn;
    WstawKoksDod: TBitBtn;
    ZapiszKoksDod: TBitBtn;
    UsunKoksDod: TBitBtn;
    ZapiszPomiar: TBitBtn;
    ZapiszPom2: TBitBtn;
    ZapiszPom3: TBitBtn;
    WstawStrefe: TBitBtn;
    ZapiszStrefe: TBitBtn;
    UsunStrefe: TBitBtn;
    WstawZapasy: TBitBtn;
    ZapiszZapasy: TBitBtn;
    UsunZapasy: TBitBtn;
    ZapiszSpust: TBitBtn;
    ZapiszSpust2: TBitBtn;
    ZapiszSpust3: TBitBtn;
    WstawNaboj: TBitBtn;
    ZapiszNaboj: TBitBtn;
    UsunNaboj: TBitBtn;
    WstawMat: TBitBtn;
    ListBox3: TListBox;
    ZapiszSyst: TBitBtn;
    Edit3: TEdit;
    Edit4: TEdit;
    RichEdit2: TRichEdit;
    RichEdit3: TRichEdit;
    DBGrid18: TDBGrid;
    ZapiszDysze: TBitBtn;
    Bevel3: TBevel;
    TabSheet5: TTabSheet;
    GroupBox10: TGroupBox;
    ListBox4: TListBox;
    Button2: TButton;
    DateTimePicker2: TDateTimePicker;
    SpinEdit5: TSpinEdit;
    RichEdit4: TRichEdit;
    GroupBox11: TGroupBox;
    PrzyciskPopZm: TBitBtn;
    PrzyciskNastZm: TBitBtn;
    GroupBox12: TGroupBox;
    RichEdit5: TRichEdit;
    GroupBox13: TGroupBox;
    StartAbsKont: TBitBtn;
    StartAbsRezyg: TBitBtn;
    Panel8: TPanel;
    Label51: TLabel;
    Label52: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Label57: TLabel;
    DateTimePicker3: TDateTimePicker;
    DateTimePicker4: TDateTimePicker;
    GroupBox14: TGroupBox;
    Label1: TLabel;
    SpinEdit3: TSpinEdit;
    PrzyciskKontynuacja: TBitBtn;
    GroupBox15: TGroupBox;
    Shape1: TShape;
    Label58: TLabel;
    WstawMedium: TBitBtn;
    ZapiszMedium: TBitBtn;
    UsunMedium: TBitBtn;
    DBGrid17: TDBGrid;
    GroupBox16: TGroupBox;
    Shape21: TShape;
    Label59: TLabel;
    WstawBilMat: TBitBtn;
    ZapiszBilMat: TBitBtn;
    UsunBilMat: TBitBtn;
    DBGrid19: TDBGrid;
    TimerBil: TTimer;
    GroupBox17: TGroupBox;
    DBGrid20: TDBGrid;
    Memo1: TMemo;
    Shape22: TShape;
    Label60: TLabel;
    WstawObsade: TBitBtn;
    ZapiszObsade: TBitBtn;
    UsunObsade: TBitBtn;
    GroupBox18: TGroupBox;
    Shape40: TShape;
    Label61: TLabel;
    DBGrid21: TDBGrid;
    Memo2: TMemo;
    WstawMaterial: TBitBtn;
    ZapiszMaterial: TBitBtn;
    UsunMaterial: TBitBtn;
    Ustawienia1: TMenuItem;
    ZmianaGazu: TMenuItem;
    AnalizySpieku: TMenuItem;
    SredniceDysz: TMenuItem;
    TablicaObsad: TMenuItem;
    TablicaMas: TMenuItem;
    GroupBox19: TGroupBox;
    DBGrid22: TDBGrid;
    Shape41: TShape;
    Label62: TLabel;
    ZapiszAktAnal: TBitBtn;
    AktAnalChem: TMenuItem;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Edit9: TEdit;
    GroupBox20: TGroupBox;
    ListBox5: TListBox;
    DBGrid23: TDBGrid;
    DBGrid24: TDBGrid;
    ZapiszInfo: TBitBtn;
    ZapiszUwUrz: TBitBtn;
    ZapiszZmKon: TBitBtn;
    ZapiszZmPrz: TBitBtn;
    ZapiszUwKier: TBitBtn;
    Label45: TLabel;
    Label46: TLabel;
    Bevel1: TBevel;
    Label47: TLabel;
    Label48: TLabel;
    Bevel2: TBevel;
    QRCompositeReport1: TQRCompositeReport;
    DalejUruchom: TBitBtn;
    TimerUruch: TTimer;
    PanelStale: TPanel;
    GroupBox21: TGroupBox;
    Label53: TLabel;
    SpinEdit9: TSpinEdit;
    TabSheet6: TTabSheet;
    GroupBox22: TGroupBox;
    StringGrid5: TStringGrid;
    Shape42: TShape;
    Shape43: TShape;
    Shape44: TShape;
    Shape45: TShape;
    Label63: TLabel;
    Label64: TLabel;
    Label65: TLabel;
    Label66: TLabel;
    DBGrid25: TDBGrid;
    ZapiszWilgotnosci: TBitBtn;
    Shape46: TShape;
    Shape47: TShape;
    Label67: TLabel;
    Label68: TLabel;
    Shape48: TShape;
    Label69: TLabel;
    Shape50: TShape;
    Label71: TLabel;
    WstawWilgKoksu: TBitBtn;
    StringGrid24: TStringGrid;
    DBGrid11: TDBGrid;
    Panel7: TPanel;
    Label25: TLabel;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    StringGrid6: TStringGrid;
    BindingsList1: TBindingsList;
    StringGrid7: TStringGrid;
    StringGrid8: TStringGrid;
    StringGridDatyWilg: TStringGrid;
    ScrollBar1: TScrollBar;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    ComboBox6: TComboBox;
    ComboBox7: TComboBox;
    ComboBox8: TComboBox;
    procedure PanelStaleDblClick(Sender: TObject);
    procedure TimerUruchTimer(Sender: TObject);
    procedure DalejUruchomClick(Sender: TObject);
    procedure QRCompositeReport1AddReports(Sender: TObject);
    procedure ZapiszInfoClick(Sender: TObject);
    procedure DBGrid24DblClick(Sender: TObject);
    procedure DBGrid23CellClick(Column: TColumn);
    procedure ListBox5DblClick(Sender: TObject);
    procedure AktAnalChemClick(Sender: TObject);
    procedure ZapiszAktAnalClick(Sender: TObject);
    procedure Label16DblClick(Sender: TObject);
    procedure ZmianaGazuClick(Sender: TObject);
    procedure TablicaMasClick(Sender: TObject);
    procedure TablicaObsadClick(Sender: TObject);
    procedure SredniceDyszClick(Sender: TObject);
    procedure AnalizySpiekuClick(Sender: TObject);
    procedure DBGrid21KeyPress(Sender: TObject; var Key: Char);
    procedure GroupBox18DblClick(Sender: TObject);
    procedure UsunMaterialClick(Sender: TObject);
    procedure ZapiszMaterialClick(Sender: TObject);
    procedure WstawMaterialClick(Sender: TObject);
    procedure Label55DblClick(Sender: TObject);
    procedure DBGrid20KeyPress(Sender: TObject; var Key: Char);
    procedure GroupBox17DblClick(Sender: TObject);
    procedure UsunObsadeClick(Sender: TObject);
    procedure ZapiszObsadeClick(Sender: TObject);
    procedure WstawObsadeClick(Sender: TObject);
    procedure GroupBox6DblClick(Sender: TObject);
    procedure TimerBilTimer(Sender: TObject);
    procedure UsunBilMatClick(Sender: TObject);
    procedure ZapiszBilMatClick(Sender: TObject);
    procedure WstawBilMatClick(Sender: TObject);
    procedure UsunMediumClick(Sender: TObject);
    procedure ZapiszMediumClick(Sender: TObject);
    procedure WstawMediumClick(Sender: TObject);
    procedure PrzyciskKontynuacjaClick(Sender: TObject);
    procedure StartAbsKontClick(Sender: TObject);
    procedure StartAbsRezygClick(Sender: TObject);
    procedure DBGrid11KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Label5DblClick(Sender: TObject);
    procedure ZapiszDyszeClick(Sender: TObject);
    procedure ZapiszSystClick(Sender: TObject);
    procedure WstawMatClick(Sender: TObject);
    procedure DBGrid7CellClick(Column: TColumn);
    procedure UsunNabojClick(Sender: TObject);
    procedure ZapiszNabojClick(Sender: TObject);
    procedure WstawNabojClick(Sender: TObject);
    procedure DBGrid10DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid8DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid5DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid6DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid14DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid9DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid7DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid13CellClick(Column: TColumn);
    procedure ZapiszSpust3Click(Sender: TObject);
    procedure DBGrid11CellClick(Column: TColumn);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure ZapiszSpustClick(Sender: TObject);
    procedure DBGrid16CellClick(Column: TColumn);
    procedure UsunZapasyClick(Sender: TObject);
    procedure ZapiszZapasyClick(Sender: TObject);
    procedure WstawZapasyClick(Sender: TObject);
    procedure UsunStrefeClick(Sender: TObject);
    procedure ZapiszStrefeClick(Sender: TObject);
    procedure WstawStrefeClick(Sender: TObject);
    procedure DBGrid15CellClick(Column: TColumn);
    procedure DBGrid14CellClick(Column: TColumn);
    procedure UsunPylClick(Sender: TObject);
    procedure ZapiszPylClick(Sender: TObject);
    procedure WstawPylClick(Sender: TObject);
    procedure DBGrid4CellClick(Column: TColumn);
    procedure ZapiszPomiarClick(Sender: TObject);
    procedure DBGrid9CellClick(Column: TColumn);
    procedure UsunKoksDodClick(Sender: TObject);
    procedure ZapiszKoksDodClick(Sender: TObject);
    procedure WstawKoksDodClick(Sender: TObject);
    procedure DBGrid10CellClick(Column: TColumn);
    procedure UsunAnalKkClick(Sender: TObject);
    procedure ZapiszAnalKkClick(Sender: TObject);
    procedure WstawAnalKkClick(Sender: TObject);
    procedure DBGrid8CellClick(Column: TColumn);
    procedure UsunSitKokClick(Sender: TObject);
    procedure ZapiszSitKokClick(Sender: TObject);
    procedure WstawSitKokClick(Sender: TObject);
    procedure DBGrid6CellClick(Column: TColumn);
    procedure UsunSitSpClick(Sender: TObject);
    procedure ZapiszSitSpClick(Sender: TObject);
    procedure WstawSitSpClick(Sender: TObject);
    procedure DBGrid5CellClick(Column: TColumn);
    procedure UsunAnalSpClick(Sender: TObject);
    procedure ZapiszAnalSpClick(Sender: TObject);
    procedure WstawAnalSpClick(Sender: TObject);
    procedure ZapiszPostojClick(Sender: TObject);
    procedure UsunPostojClick(Sender: TObject);
//    procedure DBMemo1Change(Sender: TObject);
    procedure DBComboBox1DropDown(Sender: TObject);
    procedure DBComboBox1Change(Sender: TObject);
    procedure StringGrid29DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid28DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid26DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid25DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid24DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure WstawPostojClick(Sender: TObject);
    procedure StringGrid4DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure DBGrid4DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure KontynuacjaClick(Sender: TObject);
    procedure StartAbsolutnyClick(Sender: TObject);
    procedure StringGrid10DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure TimerConectTimer(Sender: TObject);
    procedure Panel6Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid3DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid9DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Label18DblClick(Sender: TObject);
    procedure StringGrid10KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid11KeyPress(Sender: TObject; var Key: Char);
    procedure Label50DblClick(Sender: TObject);
    procedure TabSheet2Show(Sender: TObject);
    procedure Panel4Click(Sender: TObject);
    procedure TimerPomTimer(Sender: TObject);
    procedure TimerSpuSpiTimer(Sender: TObject);
    procedure TimerKatyTimer(Sender: TObject);
    procedure TimerCzasTimer(Sender: TObject);
    procedure Aktualizuj1Click(Sender: TObject);
    procedure Poczpostoju1Click(Sender: TObject);
    procedure Koniecpostoju1Click(Sender: TObject);
    procedure Koniec1Click(Sender: TObject);
    procedure Podgldraportu1Click(Sender: TObject);
    procedure Popzmiana1Click(Sender: TObject);
    procedure Dowolnazmiana1Click(Sender: TObject);
    procedure Biezmiana1Click(Sender: TObject);
    procedure Nastzmiana1Click(Sender: TObject);
    procedure Drukuj1stron1Click(Sender: TObject);
    procedure Drukuj2stron1Click(Sender: TObject);
    procedure Zamknijraport1Click(Sender: TObject);
    procedure AppException(Sender: TObject; E: Exception);
    procedure StringGrid5DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure ZapiszWilgotnosciClick(Sender: TObject);
    procedure StringGrid9MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure StringGrid9MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure WstawWilgKoksuClick(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox1DropDown(Sender: TObject);
  private
    { Private declarations }
    procedure Nagl(StrGrid  : TStringGrid; Text : string; Rec :TRect);
    procedure NagTab(Shape :TShape; Grid :TStringGrid; ColF,ColL  :Integer;
                        Lab  :TLabel);
    procedure SzerTab(dbGrid :TDBGrid; Grid :TStringGrid; PraOgr  :Integer);
//    procedure LiczDane(czas  : TDateTime);
    procedure StartKontynuacja(step  : integer);
    procedure KrokObliczen(time  : TDateTime);
    procedure ZapiszStanDyszy(czas  : TDateTime; raportID  : Integer);
    procedure WstawPomGodz(czas  : TDateTime; raportID  : Integer);
    procedure WstawPomChwil(czas  : TDateTime);
    procedure Zaladunek(czas  : TDateTime; raportID, zmn  : Integer);
    procedure Katy(czas  : TDateTime);
    procedure WstawAnalizyChem(czas  : TDateTime);
    procedure SredniSpiekTasm(raportID  : Integer);
    procedure UstawStanAnalizy(raportID,stan :Integer; rodz :string);
    procedure WstawSpustyPocz(czas  : TDateTime);
    procedure WstawSpustyZuzel(czas  : TDateTime);
    procedure UtworzBrakSpust(spust  : Integer);
    procedure WstawSpustyTemp(czas  : TDateTime);
    procedure WstawSpustyDekl(czas  : TDateTime);
    procedure WstawSpustyRzecz(czas  : TDateTime);
    procedure WstawSpustyKon(czas  : TDateTime);
    procedure WstawSpustyAnalizy(czas  : TDateTime);
    procedure UtworzNowaZmiana(czas  : TDateTime);
    procedure PrzeniesZapasy();
    procedure PrzeniesMedia();
    procedure BilansZaladunku(czas  : TDateTime);
    procedure BilansMediow(czas  : TDateTime);
    procedure ZmianaCzasu();
    procedure Uruchomienie();
    procedure Podglad;
    procedure File2StringGrid(StringGrid: TStringGrid; FileName: String);
    procedure StringGrid2File(StringGrid: TStringGrid; FileName: String);
    procedure UstawWyswietlaneWilg;
    procedure WstawDatyDoStringGridDatyWilg(data : TDate);
    procedure WyswietlDaneWilg(Sender: TObject; data : TDateTime);
    procedure WyliczWilgOd1ego(Sender: TObject; data : TDateTime);
  public
    { Public declarations }
    iNrDyszy            : Byte;
    procedure OtworzRaport(czas  : TDateTime);
    procedure WyczRaport;
    procedure WstawKomunikat;
    procedure ZapiszKomunikat;
    procedure BilansSur();
    procedure UstawDBGrid7;
    procedure LiczWzoryZalad;
    procedure LiczWzoryPom;
  end;

Dla mnie neizrozumiałe jest że FindComponent działa w drugiej części głównego if'a tj. po else a w pierwszej nie. Nawet gdy wpisuję identyczny kod, wyszukujący komponentów statycznie umieszczonych na formie, np:

if Assigned(TStringGrid(FindComponent('StringGrid5'))) then
sleep(3);

po else wchodzi w sleep(3), a przed nie...

Zobacz pozostały 1 komentarz
Patryk27
Btw - nie musisz rzutować na TStringGrid/TButton/wtf, aby sprawdzić czy FindComponent się powiodło.
Patryk27
Btw2 - nie nazywaj komponentów Button1, StringGrid10... Te nazwy nic nie mówią.
vpiotr
@Patryk27: a ty wszystkie komponenty nazywasz dokładnie? Paneliki, groupboxy i labelki też?
Patryk27
Teraz zauważyłem, że jednak większość jest ponazywana; mea culpa - zbyt szybko spojrzałem na kod. A odpowiadając na pytanie - nie wszystkie komponenty, jednak (jeżeli już coś robię w GUI, co samo w sobie jest rzadkością) większość staram się logicznie ponazywać.
1

Kod wrzuć lepiej do pastebin i staraj się nie nazywać funkcji po polskiemu...

@Patryk27 , ty też postaraj się pisać po polsku ;) .

with DataModule1.dbqRzMat do - może coś ci przesłania TForm1 i używasz FindComponent na czymś innym. Sprawdź Self.FindComponent.

Zawsze też możesz zrobić po prostu tablicę z ComboBoxami i nie używać RTTI które moim zdaniem i tak jest lamerskie.

LA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:17
0

with DataModule1.dbqRzMat do - może coś ci przesłania TForm1 i używasz FindComponent na czymś innym.
BINGO!
-123oho +1 :D
Problematyczny kod wyrzucony poza ramy with ... do wykonuje się bezproblematycznie.

@Patryk27:

Kod wrzuć lepiej do pastebin i staraj się nie nazywać funkcji po polskiemu
myślę, że to personalne upodobania i każdy może mieć jakie chce dopóki nie przeszkadzają w kodowaniu, nie gmatwają kodu itd.

flowCRANE
Zawsze możesz używać tej konstrukcji w bloku "with do" pod warunkiem, że wskażesz korzeń - czyli "Form1" (np. "Form1.FindComponent()");
L3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 10 lat
  • Postów:106
0

sory za odkopywanie trupów.
miałem podobny problem i poradziłem sobie tak ze po prostu rekursywnie robiłem listę komponentów zaczynając od znanego rodzica, i jechałem po liście.
dzieki temu byłem pewien ze coś już istnieje, i nie dostawałem takich krzaków jak ty

Kopiuj
unit uControls;

interface
  uses Classes, Controls, uBaseObject;

  Type
    TControlsList = class(TList)
    private
      procedure PutCtrl(Index: integer; Value: TControl);
      function GetCtrl(Index: integer): TControl;
    public
        constructor Create; virtual;
        destructor Destroy; override;
        function Add(Item : TControl) : Integer;
        function IndexOf(AItem: Pointer): integer; overload;
        property Items[Index: Integer]: TControl read GetCtrl write PutCtrl; default;
    end;

   var ControlsList : TControlsList;

   Procedure PopulateControls(aParent: TWincontrol);
   Procedure FreeControlsList;

implementation

uses
  SysUtils;


procedure PopulateControlsRecursive(Rodzic: TWincontrol);
var
 i1 : Integer;
 ctrl : TControl;
begin
  ControlsList.Add(Rodzic);
  for i1 := 0 to Rodzic.ControlCount - 1 do
  begin
    ctrl := Rodzic.Controls[i1];
    if ctrl is TWincontrol then
      PopulateControlsRecursive(TWinControl(ctrl))
    else
      ControlsList.Add(TWinControl(ctrl));
  end;
end;

Procedure PopulateControls(aParent: TWincontrol);
begin
  if Assigned(ControlsList) then FreeAndNil(ControlsList);
  ControlsList := TControlsList.Create();
  PopulateControlsRecursive(aparent);

end;

Procedure FreeControlsList;
begin
  if assigned(ControlsList) then freeandnil(ControlsList);
  
end;

{ TControlsList }

procedure TControlsList.PutCtrl(Index: integer; Value: TControl);
begin
  inherited Items[Index] := Value;
end;

function TControlsList.GetCtrl(Index: integer): TControl;
begin
  Result := TControl(inherited Items[Index]);
end;
constructor TControlsList.Create;
begin
  inherited Create;
end;

destructor TControlsList.Destroy;
begin

  inherited Destroy;;
end;

function TControlsList.Add(Item: TControl): Integer;
begin
  Result := inherited Add(Item);
end;


function TControlsList.IndexOf(AItem: Pointer): integer;
begin
  Result := 0;
  while (Result < Count) and (Pointer(Items[Result]) <> AItem) do
    Inc(Result);
  if Result = Count then
    Result := -1;
end;



end.

 

i potem

Kopiuj
populatecontrols(jakispanel);

for i:= 0 to controlslist.count - 1 do
begin
  if controlslist[i] is tbutton then ...
end

freecontrolslist;

 
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)