komponent przekazywanie danych

komponent przekazywanie danych
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

Napisalem komponent obslugujacy rozklad pola magnetycznego. Problem pojawia sie przy przekazywaniu procentowego postepu. Załuzmy ze w komponencie jest funkcja:

Kopiuj
procedure jakasfunkcja(var A,B:double;progress:integer);
var i:integer;
begin
 for i:=1 to 100 do
  begin
   B:=A+i;
   progress:=i;
  end;
end;

Taka procedure wywoluje w nowej aplikacji kozystajacej z komponentu:

Kopiuj
 NumericalMethods1.jakasfunkcja(X,Y,ProgressBar1.position);

Niestety nie odzwierciedla sie to na progresbarze


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

było tyle razy Application.ProcessMessages


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

Ale gdzie to wstawic? Bo procedura jakasfunkcja jest w komponencie i do niej sie odwołuje w nowej formie na która stawiam ten komponent.
Probowelem wstawic w kodzie procedury komponentu ale wywala ze nie identyfikuje Application.


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

Jeśli to jest komponent to to się robi inaczej - tworzysz event, który będzie uruchamiany w momencie zwiększenia progresa o 1. Wtedy podpinasz pod takiego eventa procedurę, która ustawia odpowiednio progressbar. Oczywiście cały kod jakasfunkcja powinien wykonywać się w wątku (o ile to możliwe) aby nie zamrażał aplikacji. Jeśli bardzo nie wiesz jak to zrobić to daj znać na forum to Ci napiszę mniej więcej jak to ma wyglądać


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

no wlasnie nie za bardzo wiem. Wiec sprawa wygląda tak:
jest sobie procedura obliczania metoda choleskyego,gaussa,crouta,gradientów itp. Musze mieć procentowe wskazania postepu dla kazdej z nich.
Caly kod komponentu wstawilem na ftp.
ftp.lanet.net.pl
user:u101099
pasword:highlander82
Spojrz jesli mozesz na to.
Dzienx [browar]


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

najpierw kilka uwag

  1. jak nie zmieniasz wartości zmiennych to nie przekazuj ich przez wartość, np
Kopiuj
procedure TNumericalMethods.multiplication_vectors(var A,B:Tvector;var Result:double);
var i:integer;
begin
 FMethod:='multiplication_vectors';
 if length(A)<>length(B) then raise Exception.Create('procedure multiplication_vectors return fatal error code:'+#13+'Actual size of A,B:Tvector mismatch');
 Result:=0;
 for i:=low(A) to high(A) do Result:=Result+A[i]*B[i];
end;

poprawnie powinno być

Kopiuj
function TNumericalMethods.multiplication_vectors(A,B:Tvector): double;
var 
  i:integer;
begin
  FMethod := 'multiplication_vectors';
  if length(A) <> length(B) then 
    raise Exception.Create('procedure multiplication_vectors return fatal error code:'+#13+'Actual size of A,B:Tvector mismatch');
  Result:=0;
  for i := low(A) to high(A) do 
    Result := Result + A[i] * B[i];
end;
  1. na początku zadeklaruj sobie typ wyliczeniowy
Kopiuj
type
  TMetodType = (mtMultiplicationVectors, mtValidateMultiplicationVectorMatrix, mtMultiplicationNumberVector, ...)

i potem zmień tym pola Method ze string na TMetodType - user będzie mógł wybrać metodę z listy a nie wpisać cokolwiek. write zmienił bym na SetMethod i w procedurze obsługi oprócz ustawiania FMetod ustawiał bym też FAboutMetod

  1. ja bym to trochę inaczej zrobił bo tak jak masz teraz to na dobrą sprawę całe opakowanie w komponent jest dla picu tylko. Wszystkie potrzebne do obliczenia zmienne (także wyjściowe) przerobił bym na pola, dodał jedną metodę Execute oraz zmienił jak w 2 napisałem. W Execute na podstawie FMetod sprawdzał bym czy odpowiednie pola są wypełnione i czy wypełnione są poprawnie i jeśli tak to odpalał bym odpowiednią metodę (wszystkie te wywołania zrobiłbym prywatne).
    Oczywiście trzeba by dla TVector, TMatrix itd napisać jeszcze edytory ale przynajmniej by to wtedy porządnie i fachowo wyglądało :)

dobra, pomarudziłem to teraz event :)

Kopiuj
type
  TProgressEvent = procedure(Max, Pos: Integer) of object;

type
  TNumericalMethods=class(TComponent)
  private
    { Private declarations }
    FOnProgres: TProgressEvent;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property OnProgres: TProgressEvent read FOnProgres write FOnProgres;
  end;

i w funkcji, która ma uaktualniać progresa

Kopiuj
procedure ....
begin
  ...
  if Assigned(FOnProgres) then
    FOnProgress(Max, Pos);
  ...
end;

i jeszcze trzeba dopisać samą obsługę progressbara ale to już banalne

z tym, że jeśli te obliczenia nie będą w osobnym wątku to program i tak będzie "zamarzał" na czas ich wykonywania


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0
Misiekd napisał(a)

najpierw kilka uwag

  1. jak nie zmieniasz wartości zmiennych to nie przekazuj ich przez wartość, np
Kopiuj
procedure TNumericalMethods.multiplication_vectors(var A,B:Tvector;var Result:double);
var i:integer;
begin
 FMethod:='multiplication_vectors';
 if length(A)<>length(B) then raise Exception.Create('procedure multiplication_vectors return fatal error code:'+#13+'Actual size of A,B:Tvector mismatch');
 Result:=0;
 for i:=low(A) to high(A) do Result:=Result+A[i]*B[i];
end;

poprawnie powinno być

Kopiuj
function TNumericalMethods.multiplication_vectors(A,B:Tvector): double;
var 
  i:integer;
begin
  FMethod := 'multiplication_vectors';
  if length(A) <> length(B) then 
    raise Exception.Create('procedure multiplication_vectors return fatal error code:'+#13+'Actual size of A,B:Tvector mismatch');
  Result:=0;
  for i := low(A) to high(A) do 
    Result := Result + A[i] * B[i];
end;

Mam pytanie czy nie powoduje to kopiowanie do procedury tej tablicy tzn jak ja wywolam od tabA a w procedurze jest A to chyba nastepuje kopiowanie z tabA do A. Przekazuje dane przez referencje. Pola FMethod i AboutMethod to tylko informacje dla usera. w trybie silent nie sa przekazywane i np user nie widzi ze wykonuja sie odpowiednie czesci procedury.
Jeśli chodzi o tego eventa to mam napisac eventa, a w nim wszystkie procedury powinny byc? bo to nie wykonalne od strony uzytkowania. Uzytkownik podaje NumericalMethods1.v_multiplication_matrix_vector(dane.....) i to mu leci. Musialby tak jak mówisz zmienic Method na typ wyliczeniowy i case of Fmethod wywolywac w evencie dana procedure.

Kopiuj
type Fmethod=(metoda1,metoda2,metoda3....)

a potem wywolanie w event

Kopiuj
case metoda(jest typu Fmethod) of
 metoda1: begin
               end
itd.

Dobrze myśle?? Tablice które obsługuje maja rozmiar 10000x10000


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

ech tu masz przykładowy projekt + komponent który pokazuje ideę :)
Twój kod liczący coś trzeba umieścić w ExecuteNormal zamiast tej pętli przy pracy bez wątków lub w Execute (wątku) jeśli ma liczyć w wątku

Np. metoda Crout_method mogła by wyglądać tak (nie wiem czy FMax nest dobrze policzone ale powinno być mniej więcej tyle przebiegów w wybranych pętlach)

Kopiuj
var
  APos: Integer;
  i, j: integer;
  L, U: Tmatrix;
  Y: Tvector;
begin
  APos := 0;
  FMax := Length(B) * 4 + Length(Result);

  if SilentMode=false then
  begin
    FMethod:='Crout_method';
  end;
  Setlength(L,length(B));
  Setlength(U,length(B));
 
  //*********
  for i:=low(L) to high(L) do
  begin
    Setlength(L[i],i+1);
    Setlength(U[i],length(U)-i);
    DoProgress(APos);
    Inc(APos);
  end;
  //*********

  Setlength(Y,length(B));
  Crout_factorization(A,val_A,L,U);

  //********
  for i:=low(Y) to high(Y) do 
  begin
    Y[i]:=B[i];
    DoProgress(APos);
    Inc(APos);
  end;
  //***********

  for i:=low(Y) to high(Y) do
  begin
    Y[i]:=Y[i]/L[i,i];
    for j:=i+1 to high(Y) do 
      Y[j]:=Y[j]-L[j,i]*Y[i];
    DoProgress(APos);
    Inc(APos);
  end;


  for i:=high(Y)-1 downto low(Y) do
  begin
    for j:=low(Result) to i do 
      Y[j]:=Y[j]-U[j,high(U)-(i+1)]*Y[i+1];
    DoProgress(APos);
    Inc(APos);
  end;

  for i:=low(Result) to high(Result) do 
  begin
    Result[i]:=Y[i];
    DoProgress(APos);
    Inc(APos);
  end;

  Finalize(L);
  Finalize(U);
  Finalize(Y);
  
  if Assigned(FOnDone) then
    FOnDone(Self);
end;

aa DoProgress wygląda tak

Kopiuj
procedure TTestComp.DoProgress(Pos: Integer);
begin
  if Assigned(FOnProgres) then
    FOnProgres(Self, FMax, Pos);
end;

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

nie moge tego zassać. Jak mozesz wrzuc na ftp.lanet.net.pl
user:u101099, pasword:highlander82
Dzienx
[browar] for You


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

poszło

BTW czemu nie możesz pobrać z 4p? co Ci wyskakuje?


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

Pakiet o tym ID nie istnieje
[diabel]


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

mi się otwiera normalnie :) no ale masz na ftpie


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

Dzienx MisiekD o to chodziło [browar]
Heh jeszcze sie musze dużo nauczyc co do programowania komponentów :/


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
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)