najpierw kilka uwag
- jak nie zmieniasz wartości zmiennych to nie przekazuj ich przez wartość, np
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ć
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;
- na początku zadeklaruj sobie typ wyliczeniowy
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
- 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 :)
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
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