Hello!

I have a question: How to improve refreshing speed?

Problem is as follows: I refresh labels and textfields very offen in table 
views. The refreshing consists of changing mainly background, but also  
foreground, fontsize etc. The way I am doing it is using 
$object->Change( @parameters )
function which is encapsulated in my Refresh(...) function (this function is 
copied later on). As you can see the Change method is the main part of the 
Refresh function.

Because there is many such refreshings the user fills some slowness. Is it 
possible in a relatively simple way to replace this Change function with some 
other which would be closer (and therefore faster) to Windows system graphics?

Waldemar

==============================


sub Refresh {
        my ( $screen, $object, $type ) = ( shift, shift, shift );

    $object = '' unless $object;
        return unless $screen->{$object};

        my %parameter;
        my @attributes = ();
        my @attributes_2;
        my ( $par, $val );
        my %new_font = Win32::GUI::Font::Info($screen->{$object}->GetFont());

        my $change_value      = 0;      my $value    = '';
        my $change_visible    = 0;      my $visible  = 0;
        my $change_readonly   = 0;      my $readonly = 0;
        my $change_font       = 0;

        while ( $par = shift ) {

                $val = shift;
#print "par/value  = $par / $value\n";

                if ( $par eq '-visible' ) {
            $change_visible = 1;
            $visible = $val;
            $visible = 0 unless $visible;

                } elsif ( $par eq '-readonly' ) {
            $change_readonly = 1;
            $readonly = 1 if $val;
            $readonly = 0 unless $readonly;

                } elsif ( $par eq '-background' ) {

                        push   @attributes,   ( -background=>$val );
#                       push   @attributes_2, ( -background=>$val );

                } elsif ( $par eq '-text' ) {
            $change_value = 1;
            $value        = $val; $value = '' unless defined $value;

                } else {
                        push @attributes,   ( $par=>$val );
        }


                if ( $par =~ /-fontsize|-fontweight/ ) {

                        $val  = 0 unless $val;
                        $val += 0;

                        if ( $par eq '-fontsize' && $val != $new_font{-height} 
) {
                                $change_font       = 1;
                                $new_font{-height} = $val;
                        } elsif ( $par eq '-fontweight' && $val != 
$new_font{-weight} ) 
{
                                $change_font       = 1;
                                $new_font{-weight} = $val;
                        }
                } elsif ( $par =~ /-fontname/ && $val ne $new_font{-name} ) {
                        $change_font     = 1;
                        $new_font{-name} = $val;
                }
        }

        if ( $change_font ) {
                $screen->{$object.'font'} =  Win32::GUI::Font->new(
                        -name  => $new_font{-name},
                        -size  => $new_font{-height},
                        -weight=> $new_font{-weight},
                );
                push @attributes, ( -font=>$screen->{$object.'font'} );
    }

        if ( $type =~ /checkbox|boolean/i ) {

                if ( $value ) {
                        push @attributes,   ( -background=>0xccffcc )
                } elsif ( $value eq '0' ) {
                        push @attributes,   ( -background=>0xccccff )
                } else {
                        push @attributes,   ( -background=>0xffffff )
                }
        } elsif ( $type =~ /integer/i ) {

                my $val = $value;
                $val = 0 unless $val;
                $val =~ s/ //g;
                $val += 0;

        } elsif ( $type =~ /money/i ) {

                my $val = $value;
                $val = 0 unless $val;
                $val =~ s/ //g;
                $val += 0;

                if ( $val < 0  ) {
                        push @attributes,   ( -foreground=>0x0000aa )
                } elsif ( $val > 0  ) {
                        push @attributes,   ( -foreground=>0x000000 )
                } else {
                        push @attributes,   ( -foreground=>0x333333 )
                }
        }

        if ( @attributes ) {

#print "object     = $object\n";
#print "attributes = @attributes\n";

                $screen->{$object}->Hide()                              if 
$change_font;
                $screen->{$object}->Change(@attributes) if @attributes;
                $screen->{$object}->Show()                              if 
$change_font;
    }

        $screen->{$object.'_2'}->Change(-text=>'',@attributes_2) if 
@attributes_2 
&& $screen->{$object.'_2'} && $object=~/VAR|FILL/i;
        $screen->{$object.'_3'}->Change(-text=>'',@attributes_2) if 
@attributes_2 
&& $screen->{$object.'_3'} && $object=~/VAR|FILL/i;

        if ( $change_visible ) {
                $screen->{$object}->Show(1)      if $visible;
                $screen->{$object.'_0'}->Show(1) if $visible            && 
$screen-
>{$object.'_0'};
                $screen->{$object.'_1'}->Show(1) if $visible            && 
$screen-
>{$object.'_1'};
                $screen->{$object.'_2'}->Show(1) if $visible            && 
$screen-
>{$object.'_2'};
                $screen->{$object.'_3'}->Show(1) if $visible            && 
$screen-
>{$object.'_3'};

                $screen->{$object}->Hide()       if $visible == 0;
                $screen->{$object.'_0'}->Hide()  if $visible == 0       && 
$screen-
>{$object.'_0'};
                $screen->{$object.'_1'}->Hide()  if $visible == 0       && 
$screen-
>{$object.'_1'};
                $screen->{$object.'_2'}->Hide()  if $visible == 0       && 
$screen-
>{$object.'_2'};
                $screen->{$object.'_3'}->Hide()  if $visible == 0       && 
$screen-
>{$object.'_3'};
    }

        if ( $change_readonly ) {
                $screen->{$object}->ReadOnly( $readonly );
                $screen->{$object.'_2'}->ReadOnly( $readonly ) if $screen-
>{$object.'_2'} && $object =~ /VAR/;;
                $screen->{$object.'_3'}->ReadOnly( $readonly ) if $screen-
>{$object.'_3'} && $object =~ /VAR/;;
        }

        if ( $change_value ) {

                if ( $type =~ /checkbox/i ) {

                $value = 1 if     $value;
                        $value = 0 unless $value;
                        $screen->{$object}->SetCheck( $value )

                } elsif ( $type =~ /datetime/i ) {

                        $value =~ /(\d{2})-(\d{2})-(\d{4})/;
                        $screen->{$object}->SetDate( $1, $2, $3 );

                } else {

                        if ( $type =~ /boolean/i ) {
                        $value = 1 if     $value;
                                $value = 0 unless $value;
                        }

                        $value = '' unless defined $value;
                        $screen->{$object}->Change( -text => $value );

                }
        }
}

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Perl-Win32-GUI-Users mailing list
Perl-Win32-GUI-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/

Reply via email to