Avatar billede hugopedersen Nybegynder
19. august 2008 - 15:27 Der er 12 kommentarer og
1 løsning

Progressmeter i sit eget vindue

Er der nogen der ligger inde på et progressmeter som man kan includere og kalde så det vises i sit eget vindue der står fast i front?

Jeg kan forestille mig at der skal være min 3 procedurer der skal kaldes:
1 der opretter/viser baren med rigtige caption
1 der opdaterer progress til at vise aktuelle værdi
1 der fjerner baren igen

Jeg har rodet en del med det men kan ikke få noget fornuftigt ud af det synes jeg ikke.
Avatar billede hrc Mester
19. august 2008 - 16:12 #1
Der er da ikke de store problemer med det. Lav en form, smæk en TProgrssBar på. Lav den StayOnTop. Lav tre properties Min, Max, Progress (eller proceduren Increase(aStep: integer)) og du er kørende:

FormStyle := fsStayOnTop;
Position := poOwnerFormCenter;

TProgressForm = class(TForm);
  ProgressBar: TProgressBar;
private
  procedure SetMin(Value: integer); 
  procedure SetMax(Value: integer);
  procedure SetPosition(Value: integer);
  function SGtMin: integer;
  function GetMax: integer;
  function GetPosition: integer;
public
  property Min: integer read GetMin write SetMin;
  property Max: integer read GetMax write SetMax;
  property Position: integer read GetPosition write SetPosition;
  procedure Increase(const aStep: integer);
end;

implementation

procedure TProgressForm.SetMin(Value: integer);
begin
  ProgressBar.Min := Value;
end;

procedure TProgressForm.SetMax(Value: integer);
begin
  ProgressBar.Max := Value;
end;

procedure TProgressForm.SetPosition(Value: integer);
begin
  if ProgressBar.Position <= Value then
  begin
    ProgressBar.Position := Value;
    Application.ProcessMessages;
  end;

end;

function TProgressForm.GetMin: integer;
begin
  result := ProgressBar.Min;
end;

function TProgressForm.GetMax: integer;
begin
  result := ProgressBar.Max;
end;

function TProgressForm.GetPosition: integer;
begin
  result := ProgressBar.Position;
end;

procedure Increase(const aStep: integer);
var
  i: integer;
begin
  for i := ProgressBar.Position to ProgressBar.Position + aStep do
    SetPosition(i);
end;

Hvis dette ikke virker for dig kan man lave det som en tråd og sende Messages til den - skal gerne prøve lave et eksempel. Bare ikke nu, for jeg skal hjem
Avatar billede hugopedersen Nybegynder
20. august 2008 - 06:49 #2
Hvis du skulle få en ledig stund på et tidspunkt, så må du da meget gerne brygge et eksempel sammen.
Jeg kender godt det der med at skulle hjem - jeg er ved at lave nyt badeværelse, så lillemor synes også at arbejdet tager for meget af min fritid :-)
Avatar billede hrc Mester
21. august 2008 - 22:19 #3
Jeg har lidt her som du måske kan bruge. Der er en status-form som du kan få frem vha. ShowStatus, fjerne igen med HideStatus og justere vha. SetPosition.

Kan godt poste det hele her, men det fylder meget at skulle poste testprogram, unit, dfm-filer så hvis du hellere vil have en zip-fil må jeg have en email.
Avatar billede hugopedersen Nybegynder
22. august 2008 - 06:48 #4
Det vil jeg da meget gerne have lov at se

Du kan bruge hp snabela consol punktum dk som mailadresse.
Avatar billede hrc Mester
22. august 2008 - 07:12 #5
Glemte at lagre filen et sted hvor jeg kunne sende den fra arbejdedet. Sender i eftermiddag. Den flyvske idé med en tråd er ikke relevant; det var et vildskud. Den tunge behandlingsdel burde trådes, ikke statusvisningensformen.

Eksempelvis har jeg en billedklasse, der nedarver fra TImage, som bruger sin egen tråd til at hente billedet fra tabellen. Når formen åbnes, hentes ID på billederne frem, billedobjekterne oprettes. Samtidig med de fyldes i et TScrollPanel startes hente-trådene. Fra et nørdet synspunkt ser det ret godt ud når billederne popper op. En variant af dette: Når tråden har hentet billedet, sender den besked til næste billede i rækken om at aktivere sin tråd. Det ser lidt pænere ud at billederne dukker op i rækkefølge, det tager bare lidt længere tid.
Avatar billede hugopedersen Nybegynder
22. august 2008 - 09:22 #6
Nu er du ude i noget der lyder meget 'nørdet' i mine ører :-)

Jeg er kun databaseprogrammør så alle de der fancy ting overlader jeg til dem der er eksperter i det - så kommer jeg ikke galt af sted.

Det jeg er igang med er et program der læser nogle records fra en masse Paradox filer og smider dem op på en MySQL server. (nogle records er måske en underdrivelse - der er >4.000.000 i alt)
Avatar billede hrc Mester
22. august 2008 - 10:08 #7
Kan du ikke bruge DataPump til det?
Avatar billede hugopedersen Nybegynder
22. august 2008 - 11:36 #8
Det er i øjeblikket > 500 filer af 11 forskellige typer og hver type kan være forskellig i antal felter så jeg har lavet et program der lister filerne en efter en og overfører dem - jeg bruger MyDAC komponenten som jeg har indkøbt til formålet.
Det er meningen at konverteringen skal køre 'unattended' 1 gang hver weekend så det skal være rimeligt foolproof :-)

Lige nu strugler jeg med at finde en eller anden måde at få udført nogle ting under initialisering. Jeg skal have checket om forbindelsen til Paradoxfilerne er OK og om forbindelsen til MySQL er OK. Al min kode ligger i hovedformularen og der kan jeg ikke finde ud af at køre noget kode inden formen vises. Men som jeg vist har nævnt så er Delphi ikke mit hovedsprog :-)
Avatar billede hrc Mester
22. august 2008 - 12:08 #9
const
  Language = 'Delphi';

if PDoxCount > 500 then
begin
  DataPump := false
  Gnarrl(true);
end
else begin
  if Option_1 then
  begin
    DataPumpAll;
    CopyPDOX_In_MySQL_To_NewMySQL_Database;
  end
  else if Option_2 then
    for i = 0 to PdoxTableCount - 1 do
      LotOfBesvær := ExplicitTableCopy(PDoxTables[i]) = LotOfWork;
end;

end.
Avatar billede hugopedersen Nybegynder
22. august 2008 - 19:25 #10
Øøøøøh ?
Avatar billede hugopedersen Nybegynder
25. august 2008 - 10:02 #11
Eksempel modtaget fra HRC bør medføre et svar fra samme da det umiddelbart dækker mit behov.
Avatar billede hrc Mester
25. august 2008 - 11:03 #12
Smider lige unitten her så andre kan se den (lavet i D2007):

DFM-filen:
----------

object frmStatus: TfrmStatus
  Left = 0
  Top = 0
  Caption = 'Status'
  ClientHeight = 41
  ClientWidth = 467
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsStayOnTop
  OldCreateOrder = False
  OnClose = FormClose
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object pbStatus: TProgressBar
    Left = 0
    Top = 0
    Width = 467
    Height = 41
    Align = alClient
    Smooth = True
    TabOrder = 0
    ExplicitHeight = 81
  end
end

PAS-filen:
----------

unit FStatus;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TfrmStatus = class(TForm)
    pbStatus: TProgressBar;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    function GetValue(const Index: Integer): integer;
    procedure SetValue(const Index, Value: integer);
  public
    constructor Create(aOwner: TComponent; const aMinValue, aMaxValue: integer; const aPosition: integer =  0); reintroduce;
    property Position: integer index 0 read GetValue write SetValue;
    property MinValue: integer index 1 read GetValue write SetValue;
    property MaxValue: integer index 2 read GetValue write SetValue;
    procedure Step(const aSteps: integer);
  end;

procedure ShowStatus(aOwner: TComponent; const aMinValue, aMaxValue, aPosition: integer);
procedure HideStatus;
procedure SetPosition(const aValue: integer);

implementation

{$R *.dfm}

var
  frmStatus: TfrmStatus;

procedure ShowStatus(aOwner: TComponent; const aMinValue, aMaxValue, aPosition: integer);
begin
  if assigned(frmStatus) then
  begin
    frmStatus.MinValue := aMinValue;
    frmStatus.MaxValue := aMaxValue;
    frmStatus.Position := aPosition;
  end
  else
    frmStatus := TfrmStatus.Create(aOwner, aMinValue, aMaxValue, aPosition);

  frmStatus.Show;
end;

procedure HideStatus;
begin
  if assigned(frmStatus) then
    frmStatus.Close;
end;

procedure SetPosition(const aValue: integer);
begin
  if assigned(frmStatus) then
  begin
    frmStatus.Position := aValue;
    Application.ProcessMessages;
  end;
end;

constructor TfrmStatus.Create(aOwner: TComponent; const aMinValue, aMaxValue, aPosition: integer);
begin
  inherited Create(aOwner);
  SetValue(1,aMinValue);
  SetValue(2,aMaxValue);
  SetValue(0,aPosition);
end;

procedure TfrmStatus.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TfrmStatus.FormDestroy(Sender: TObject);
begin
  frmStatus := nil;
end;

function TfrmStatus.GetValue(const Index: Integer): integer;
begin
  case Index of
    0: result := pbStatus.Position;
    1: result := pbStatus.Min;
    2: result := pbStatus.Max;
  end;
end;

procedure TfrmStatus.SetValue(const Index, Value: integer);
begin
  case Index of
    0: pbStatus.Position := Value;
    1: pbStatus.Min := Value;
    2: pbStatus.Max := Value;
  end;
end;

procedure TfrmStatus.Step(const aSteps: integer);
begin
  pbStatus.StepBy(aSteps);
end;

end.
Avatar billede hrc Mester
25. august 2008 - 11:04 #13
I bunden mangler linjerne:

initialization
  frmStatus := nil;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester