Hi Herbert,

On 26/06/2013 18:11, herbert breunung wrote:
greetings comrads
I  have seen the XRC custom example in Wx::Demo and did
....
         Wx::MemoryFSHandler::AddTextFile( 'file.xpm', <<'EOB' );
....
         my $ed = Wx::TextCtrl->new($frame, -1,'');
         $ed->LoadFile('memory:file.xpm');

but i get just error also loading into the bitmap doesn't work.
Any Suggestions?

Thanks a lot
Herbert aka lichtkind


I had to look at the wxWidgets source to figure out what is happening here.

It turns out that you cannot use the name of a memory file anywhere that you can use a filename. Only some specific methods accept the name of a 'memory' file. Internally, only some 'Load' methods use wxFileSystem and streams. For these methods, passing the name of a 'memory' file will work. In addition to the XRC method in Wx::Demo, Wx::HtmlWindow->LoadPage() will accept a 'memory' file.

Other methods, such as Wx::TextCtrl->LoadFile, are implemented as thin wrappers around the operating system file open / read functions. So in these cases 'memory:file.xpm' is not going to work.

I don't see anywhere in the documentation that you can tell which methods use filestreams though :(

For information, I have attached an example of how you can get a file handle to a memory file and read the content. It all looks pointless though and there seems multiple better ways to structure this in Perl.

Hope it helps

Mark

#---------------------------------------------------------------------
#/usr/bin/perl

package MyFrame;
use strict;
use warnings;
use Wx qw( :textctrl :sizer :panel :window);
use Wx::FS;
use base qw( Wx::Frame );

sub new {
    my $class = shift;
    my $self = $class->SUPER::new( @_ );
my $mainpanel = Wx::Panel->new($self, -1, [-1,-1], [-1,-1], wxTAB_TRAVERSAL|wxBORDER_NONE);
    my $text = Wx::TextCtrl->new($mainpanel, -1, "", [-1,-1],[-1,-1]);

    # Fairly pointless use of Virtual File System directly

    # Create Virtual File System
    {
        my $content = 'The quick brown fox jumped over the lazy dog';
        Wx::FileSystem::AddHandler( Wx::MemoryFSHandler->new );
        Wx::MemoryFSHandler::AddTextFile( 'sample.txt', $content );
    }

    # Get file content from virtual filesystem
    {
        my $fs = Wx::FileSystem->new;
        my $mfile = $fs->OpenFile('memory:sample.txt');
        my $fh = $mfile->GetStream;
        my $textcontent = '';
        while(<$fh>) {
            $textcontent .= $_;
        }
        $text->ChangeValue($textcontent);
    }

    # Clean up VS
    {
        Wx::MemoryFSHandler::RemoveFile( 'sample.txt' );
    }

    my $panelsz = Wx::BoxSizer->new(wxVERTICAL);
    my $framesz = Wx::BoxSizer->new(wxVERTICAL);

    $panelsz->Add($text, 1, wxEXPAND|wxALL, 0);
    $mainpanel->SetSizer($panelsz);
    $framesz->Add($mainpanel, 1, wxEXPAND|wxALL, 0);
    $self->SetSizer($framesz);

    $self->Center;
    return $self;
}

package MyApp;
use strict;
use warnings;
use Wx;
use Wx::FS;
use base qw( Wx::App );

sub OnInit {
    my $self = shift;
    my $win = MyFrame->new(undef, -1, 'Wx::FS Test');
    $self->SetTopWindow($win);
    $win->Show(1);
    return 1;
}

package main;
use strict;
use warnings;

my $app = MyApp->new;
$app->MainLoop;



















Reply via email to