Giter Site home page Giter Site logo

mailinglistvcl's People

Contributors

dariuszgraczyk avatar elproko avatar gmozejko avatar grzegorzzyla avatar jurekgx avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

mailinglistvcl's Issues

Usunąć zbędne zależności Dialogu względem Ramki

Dialog Dialog.ResolveImportConflicts.pas zależy od ramki Frame.ImportContacts.TFrameImport. Potrzebuje jedynie dostępu do danych z aktualnego (jednego) wiersza w tabeli mtabEmails. Dane te są wyświetlane w kontrolkach a w kodzie są ustawiane pola boolean: Conflicts i Import.

function ShowDialog_ResolveConflicts(FrameImportContacts: TFrame): boolean;
var
frm: TDialogResolveConflicts;
mr: Integer;
begin
try
frm := TDialogResolveConflicts.Create(Application);
frm.DataSource1.DataSet := (FrameImportContacts as TFrameImport).mtabEmails;
mr := frm.ShowModal;

Zminimalizować zależności: Można użyć typu ogólnego TFDMemTable albo połączyć dane z interfejsem użytkownika przez interfejs.

Wyszukać miejsca gdzie są zaszyte SQL-e

Wyszukać miejsca a DFM-ach, gdzie są na stałe wpisane polecenia SQL w properties-ach TFDQuery.SQL.Text. Podobnie polecenia SQL które są klejone w kodzie na stringach.

Działanie potrzebne do wydzielenia (w przyszłości) repozytorium SQL-i

Refaktoring: Frame.ImportContacts.pas - btnLoadNewEmailsClick

DONE (Zadanie zrobione):

// { TODO: Zapytanie ukryte w atrybucie *.SQL.Text - code review }

Nie widoczne wypełnianie w pętli tabeli pamięciowej mtabEmails (TFDMemTable):

mtabEmails.Open;
mtabEmails.EmptyDataSet;
mtabEmailsImport.DisplayValues := ';';
// { TODO: Zapytanie ukryte w atrybucie *.SQL.Text - code review }
// przypisano treść zapytania w kodzie
dsQueryCurrEmails.SQL.Text :=
'select email, firstname, lastname, company from Contacts ';
dsQueryCurrEmails.Open();
for i := 0 to jData.Count - 1 do
myAddRowToImportTable(jData.Items[i] as TJSONObject);

Ukryta zależność w funkcji myAddRowToImportTable od globalnego dataseta dsQueryCurrEmail:

dsQueryCurrEmails.SQL.Text :=
'select email, firstname, lastname, company from Contacts ';
dsQueryCurrEmails.Open();
for i := 0 to jData.Count - 1 do
myAddRowToImportTable(jData.Items[i] as TJSONObject);

Dwukrotne dodanie tej samej ramki

Gdy jest już otwarta ramka (na liście zakładek) próbie ponownego otwarcie wyskakuje wyjątek.

Procedura:

  • Otwórz ramkę [Import kontaktów]
  • Ponownie wybierz polecenie [Import kontaktów]

Zmiana zakładek nie przełącza ramek

Po przełaczeniu zakładek (ChromeTabs1) powinny przełączać się widoczne ramki. Jednak wudać tylko ostatnio daną ramkę.

Kroki:

  • Zaloguj się
  • Sprawdź czy widzisz główny ekaran oraz czy widoczna jest ramka powitalna (Welcome)
  • Dodaj dowolną ramkę (np. Import kontaktów)
  • Przełacz się na ramkę powitalną (Welcome)

Refaktoring Dialog.RunSQLScript.pas - demonstracyjne kontakty

Zamienić na tablicę dynamiczną:

const
NUMBER_OF_EMAILS = 5;
EmailTableData: array [0 .. NUMBER_OF_EMAILS - 1] of TEmailRec =

Dokumentacja:

Formatowanie daty niezależne od systemu (najlepiej ISO):

{ TODO : Poprawić: Formatowanie daty i czasu zależne od ustawień regionalnych }
lastName: 'Polak'; comapny: 'BSC Polska'; regDate: '15.08.2018 19:30'),

Dokumentacja

Poprawki na warsztaty - Dialog.RunSQLScript.pas

Refaktoring Form.Main.pas - tmrIdleTimer

Logika całej metody jest zbyt skomplikowana i mało czytelna:

begin
{ TODO: Przebudować logikę metody. Jest zbyt skomplikowana i mało czytelna }
tmr1 := (Sender as TTimer);

Koncepcja: stworzenie nowej metody eventOnFormFirstShow która będzie zawierała kilka metod (trzeba podzielić na prostsze elementy) - do dyskusji jakie ..

Zmienić nazwę timera na tmrFirstShow i logikę eventu tak aby wywoływany był tylko raz i potem blokowany: tmrFirstShow.Enabled := False (większe bezpieczeństwo)

Poprawki na warsztaty - Frame.ImportContacts.pas

DONE (Zadanie zrobione):

// { TODO: Zapytanie ukryte w atrybucie *.SQL.Text - code review }

Nie widoczne wypełnianie w pętli tabeli pamięciowej mtabEmails (TFDMemTable):

mtabEmails.Open;
mtabEmails.EmptyDataSet;
mtabEmailsImport.DisplayValues := ';';
// { TODO: Zapytanie ukryte w atrybucie *.SQL.Text - code review }
// przypisano treść zapytania w kodzie
dsQueryCurrEmails.SQL.Text :=
'select email, firstname, lastname, company from Contacts ';
dsQueryCurrEmails.Open();
for i := 0 to jData.Count - 1 do
myAddRowToImportTable(jData.Items[i] as TJSONObject);

Ukryta zależność w funkcji myAddRowToImportTable od globalnego dataseta dsQueryCurrEmail:

dsQueryCurrEmails.SQL.Text :=
'select email, firstname, lastname, company from Contacts ';
dsQueryCurrEmails.Open();
for i := 0 to jData.Count - 1 do
myAddRowToImportTable(jData.Items[i] as TJSONObject);

Refaktoring: Frame.ImportContacts.pas - btnImportSelectedClick

Błąd #5 naprawiony. Jednak była to szybka poprawka. Cała funkcja wymaga refaktoringu.

{ TODO: Błąd: jeśli lista do importu nie została wcześniej załadowana }
{ TODO: Zamiana zwykłych INSERT-ów i UPADTE-ów do bazy na ArrayDML }
// github: #5

Refaktoring kodu:

  • Extract Method: FindContactID (email: string)
  • Warto użyć TFDConnection.ExecScalar

FDQuery2.SQL.Text := 'SELECT contactid FROM Contacts WHERE email=''' +
email + '''';
FDQuery2.Open;
if FDQuery2.Eof then
raise Exception.Create
('Error! (FrameImport->btnImportSelected.OnClick) Email ' + email
+ ' not found during import');
id := FDQuery2.Fields[0].AsInteger;

Przechwytywany jest ogólny wyjątek (nie jest bezpieczne) i wygaszany:

except
on E: Exception do
{ TODO: Brzydko pachnie! Wyciszam wszystkie wyjątki }
// Potrzebny jest refaktoring metody powyżej aby przeanalizować
ShowMessage
('Teraz tego nie mogę zrobić! Zaimportuj najpierw listę kontaktów');
end;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.