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;