Schrift
[thread]5284[/thread]

Tk::TableMatrix->see Problem



<< >> 8 Einträge, 1 Seite
GoodFella
 2007-01-23 16:50
#46145 #46145
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Ich scrolle per Pfeiltasten durch eine Tabelle und sobald ich an den Seitenrand komme, soll eine Unit zur entsprechenden Seite gescrollt werden. Hier sei angemerkt, dass ich nicht das TableMatrix-Interne Scrollen bzw. activePosition etc. verwende, sondern alles manuell mache, sprich Pfeiltasten abfangen und Zellenhighlight selbst machen. Scrollt man nach links bzw. rechts innerhalb der ersten zwei Zeilen, funktioniert dies auch wie erwartet. Ab der dritten Zeile jedoch scrollt die Tabelle bei erwartetem horizontalen Scrollen auch vertikal.
Ich benutze hierzu $table_matrix->see("y,x");
Probierts aus, müsst aber zuerst eine Exceldatei hinzufügen, um das benutzen zu können:

http://rapidshare.com/files/13013109/mmc.pl.html

(Der Source ist recht gross, deswegen der Rapidshare-Müll, hab leider kein Hosting zur Zeit)


Weiss jemand, wie ích ->see beibringe, erwartungsgemäß zu scrollen?
PerlProfi
 2007-01-23 22:48
#46146 #46146
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Kannst du den Fehler mit einem kleinen Code Beispiel rekonstruieren?
Nur eine kleine Tablematrix mit deiner Scrollfunktion?

Du könntest auch mal einen anderen Index ausprobieren.
Vielleicht funktionierts ja mit @X,Y. X und Y sind dann aber Koordinaten in Pixel.
Aber eigentlich glaube ich, dass du irgendwo ein X und Y vertauscht hast, oder dass du falsch umgerechnet hast.

MfG PerlProfi
GoodFella
 2007-01-24 00:20
#46147 #46147
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=PerlProfi,23.01.2007, 21:48]Kannst du den Fehler mit einem kleinen Code Beispiel rekonstruieren?
Nur eine kleine Tablematrix mit deiner Scrollfunktion?

Du könntest auch mal einen anderen Index ausprobieren.
Vielleicht funktionierts ja mit @X,Y. X und Y sind dann aber Koordinaten in Pixel.
Aber eigentlich glaube ich, dass du irgendwo ein X und Y vertauscht hast, oder dass du falsch umgerechnet hast.

MfG PerlProfi[/quote]
Das wird schwer, das Ding ist ein Monster ^^
Mal sehen ob ichs hinbekomme, melde mich dann nochmal.

Zum x/y-vertauschen:
$table_matrix->index("@$x,$y");
liefert eine Liste der Form
($y, $x)
zurück. Ansonsten funktioniert der Rest von Tablematrix mit ERST y DANN x .. äusserst komisch. (@x,y Pixelkoordinaten .. y,x Zellenkoordinaten)

Ich habe mir bei jeder verwendeten sub die x/y Koordinaten printen lassen, bin mir zu 99,9% sicher, dass ich da keinen Fehler gemacht habe.

Hatte die Idee, dass ich selbst scrolle mit xscrollcommand.. dafür müsste ich aber Tk->break; benutzen .. erste Tests zeigen, dass das nicht wie erwartet funktioniert. Hat jemand dazu vielleicht ein gutes Tutorial?
ptk
 2007-01-24 01:28
#46148 #46148
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn du glaubst, Tk->break benutzen zu müssen, dann könnte es auch sein, dass du bindtags setzen musst.
GoodFella
 2007-01-28 00:52
#46149 #46149
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
@Perlprofi: Ich habe jetzt ein schlankes Beispielscript, was das Verhalten demonstriert. Dazu scrollt man mit den Pfeiltasten bis zu "3:0" herunter und dann nach rechts, bis das Scrollen einsetzt. Beim ersten Scroll wird nicht nur zur Seite gescrollt, sondern auch nach unten:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/usr/local/bin/perl -w

use Tk;
use Tk::TableMatrix;
require Tk::JBrowseEntry;
require Tk::DragDrop;
require Tk::DropSite;
use strict;

my $tm_array = {};
my $t;
my @drag = ();
my @drop = ();
my @pos = (0, 0);
my @old_pos = (0, 0);

sub switch_cells
{
 if ($drag[0] == $drop[0]) # Selbe Zeile
  {
   if ($drag[1] >= 0) # Kein Titel
    {
     my $drag_coords = $drag[0].','.$drag[1];
     my $drop_coords = $drop[0].','.$drop[1];
     my $drag_val = $tm_array->{$drag_coords};
     my $drop_val = $tm_array->{$drop_coords};

     $t->set($drop_coords, $drag_val);
     $tm_array->{$drop_coords} = $drag_val;

     $t->set($drag_coords, $drop_val);
     $tm_array->{$drag_coords} = $drop_val;
    }
  }
}

my $start_row = -3;
my $end_row = 50;
my $start_col = -1;
my $end_col = 50;
my $display_cols = 10;
my $display_rows = 10;
my $nr_rows = $end_row - $start_row + 1;
my $nr_cols = $end_col - $start_col + 1;
my $title_rows = ($start_row < 0) ? (abs($start_row)) : (0);
my $title_cols = ($start_col < 0) ? (abs($start_col)) : (0);

foreach my $row  (($start_row - $title_rows)..4)
{
 foreach my $col (($start_col - $title_cols)..$end_col)
  {
   $tm_array->{"$row,$col"} = "$row:$col";
  }
}

my $top = MainWindow->new;
$top->geometry('870x300');

$top->bind( '<MouseWheel>', [ sub { $_[0]->yviewScroll(-($_[1]/120)*3, 'units'); }, Tk::Ev('D') ] );

$t = $top->Scrolled( 'TableMatrix',
                    -titlerows => $title_rows,   -titlecols => $title_cols,
                    -rows =>      $nr_rows,      -cols =>      $nr_cols,
                    -height =>    $display_rows, -width =>     $display_cols,
                    -variable => $tm_array,
                    -roworigin => $start_row,
                    -colorigin => $start_col,
                    -colstretchmode => 'none',
                    -rowstretchmode => 'none',
                    -selectmode => 'single',
                    -drawmode => 'fast',
                    -maxwidth => 800,
                    -maxheight => 600,
                    -rowheight => -20,
                    -colwidth => -200,
                    -resizeborders => 'none',
                    -sparsearray => 0,
                    -selecttitle => 0,                    
                    -state => 'disabled',
                    -font => ['Tahoma', 10, 'bold'],
                    -bg => '#D4D0C8',
                    -fg => '#000000'
);

$t->tagConfigure('Normal',       -bg => '#D4D0C8', -fg => 'black');
$t->tagConfigure('DragSelected', -bg => '#EEEE11', -fg => 'black');
#$t->tagConfigure('DarkRed',      -bg => '#881111', -fg => 'black');
#$t->tagConfigure('LightRed',     -bg => '#EE9999', -fg => 'black');
#$t->tagConfigure('DarkGreen',    -bg => '#118888', -fg => 'black');
#$t->tagConfigure('LightGreen',   -bg => '#99EEEE', -fg => 'black');


my $cb_use = $t->Checkbutton( -text => 'nutzen' );
my @test_arr = ( 'TEXT', 'ZAHL', '#.## ¤', '#.## ¤ / # ¤', 'PLZ', 'TT.MM.JJJJ', 'TT.MM.JJ' );
my $test_var = $test_arr[0];
my $be_format = $t->JBrowseEntry( -label => '', -variable => \$test_var, -choices => \@test_arr,
                                 -state => 'normal', -font => ['Tahoma', 8], -width => 10 );
my $lbl_hl = $top->Label(-text => "Headline");

$t->windowConfigure("-3,0", -window=>$cb_use);
$t->windowConfigure("-2,0", -window=>$be_format);
$t->windowConfigure("-1,0", -window=>$lbl_hl);

my $dragging = 0;
my $dragscroll_handler;
my $dragscroll_delay = 150;
my $dragspeed_delay = 50;
my $nr_repeated = 0;
my $speed_repeat = 10;
sub handle_dragscroll
{
 if ($dragging == 0)
  {
   $dragscroll_handler->cancel;
  }
 my ($x_scrollbar_width, $y_scrollbar_height) = (21, 21);
 my ($mouse_x, $mouse_y) = $t->pointerxy;
 my ($x_left, $x_right) = ($t->rootx, $t->rootx + $t->width);
 my ($y_top, $y_bottom) = ($t->rooty, $t->rooty + $t->height);
 my $x_scroll = ($mouse_x < ($x_left + $x_scrollbar_width)) ? (-1) : (($mouse_x < $x_right) ? (0) : (1));
 my $y_scroll = ($mouse_y < $y_top) ? (-1) : (($mouse_y < ($y_bottom - $y_scrollbar_height)) ? (0) : (1));
 if (($x_scroll) == 0 and ($y_scroll == 0))
  {
   $dragscroll_handler->time($dragscroll_delay) unless ($nr_repeated == 0);
   $nr_repeated = 0;
  }
 else
  {
   $nr_repeated++;
   $dragscroll_handler->time($dragspeed_delay) if ($nr_repeated >= $speed_repeat);
  }
 $t->xviewScroll($x_scroll, 'units');
 $t->yviewScroll($y_scroll, 'units');
}


my ($dnd_t, $ds_t);

$dnd_t = $t->DragDrop( -event => '<B1-Motion>',
                      -sitetypes => [qw(Local)],
                      -startcommand =>  sub {
                                             my @coords = split(",", $t->index('@'.($t->pointerx - $t->rootx).','.($t->pointery - $t->rooty)));
                                             if (($coords[0] >= 0) and ($coords[1] >= 0))
                                              {
                                               $dragging = 1;
                                               $dragscroll_handler = $top->repeat($dragscroll_delay, \&handle_dragscroll);
                                               $t->tagCell('Normal', $drop[0].','.$drop[1]) if (@drop);
                                               $t->tagCell('Normal', $drag[0].','.$drag[1]) if (@drag);
                                               @drag = @coords;
                                               @old_pos = @pos;  
                                               @pos = @drag;
                                               $dnd_t->configure( -text => $tm_array->{$drag[0].','.$drag[1]} );
                                               $t->tagCell('DragSelected', $drag[0].','.$drag[1]);
                                               return 0;
                                              }
                                             else
                                              { return(1); }
                                            } );
$dnd_t->bind('<ButtonRelease>', sub { $dragging = 0; } );
$ds_t = $t->DropSite ( -droptypes     => ['Local'],
                      -dropcommand   => sub {
                                             $dragging = 0;
                                             $dragscroll_handler->cancel;
                                             @drop = split(",", $t->index('@'.($t->pointerx - $t->rootx).','.($t->pointery - $t->rooty)));
                                             @old_pos = @pos;  
                                             @pos = @drop;
                                             $t->tagCell('Normal', $drag[0].','.$drag[1]);
                                             $t->tagCell('DragSelected', $drop[0].','.$drop[1]);                
                                             &switch_cells;
                                            } );

my $button = $top->Button( -text => 'Exit', -width => 135, -command => sub{ $top->destroy } );
$t->place( -x =>  20, -y => 20 );

$button->place( -x => 20, -y => 260 );

$t->tagCell('DragSelected', $pos[0].','.$pos[1]);  

sub change_position
{  
 my ($y, $x) = @_;
 my @new_pos = ($pos[0] + $y, $pos[1] + $x);
 return if (($new_pos[0] < 0) or ($new_pos[0] > $end_row) or ($new_pos[1] < 0) or ($new_pos[1] > $end_col));
 $t->tagCell('Normal', $pos[0].','.$pos[1]);
 $t->tagCell('DragSelected', $new_pos[0].','.$new_pos[1]);    
 @old_pos = @pos;  
 @pos = @new_pos;
 $t->see(join(",", @pos));
}

$top->bind( '<KeyPress-Left>',  sub { &change_position(  0, -1 ); } );
$top->bind( '<KeyPress-Right>', sub { &change_position(  0,  1 ); } );
$top->bind( '<KeyPress-Up>',    sub { &change_position( -1,  0 ); } );
$top->bind( '<KeyPress-Down>',  sub { &change_position(  1,  0 ); } );

Tk::MainLoop;


@ptk: Danke, werde mal googlen bzw. CPANen.


Achja, [ perl ] .. [/ perl ] hat den Code zerschossen, deswegen hab ich normale CodeTags benutzt.
PerlProfi
 2007-01-28 11:38
#46150 #46150
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Mmh... dein Beispiel funktioniert bei mir überhaupt nicht:
Code: (dl )
1
2
3
4
5
6
Had to create Tk::XlibVtab unexpectedly at C:/Perl/lib/DynaLoader.pm line 253.
Use of uninitialized value in subroutine entry at C:/Perl/lib/DynaLoader.pm line 253.
2c50ea4 is not a hash at C:/Perl/lib/Tk/Widget.pm line 190.

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.


Ich hab das Skript mit Perl v5.8.8 auf WinXP getestet.

MfG PerlProfi
GoodFella
 2007-01-28 15:46
#46151 #46151
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Quote
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 33 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 819 [267479] provided by ActiveState http://www.ActiveState.com
Built Aug 29 2006 12:42:41
..auch XP und bei mir funktioniert es..

Ist dann schon komisch, dass mein viel grösseres Script aus dem ersten Post bei dir geht (oder hast dus nicht ausprobiert?)
Die beiden Scripte entscheiden sich eigentlich nur im Funktionsumfang, wobei letzteres kaum Funktion besitzt ausser der zu debuggenden.\n\n

<!--EDIT|GoodFella|1169992167-->
PerlProfi
 2007-01-28 16:24
#46152 #46152
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Nein dein erstes Skript habe ich nicht ausprobiert.
Hab mal ein bisschen gegoogelt, aber ich konnte nicht herausfinden warum ich TableMatrix nicht benutzen kann.

Naja, es sieht auch nicht danach aus, dass du X und Y irgendwo vertauscht hast.

Hast du schonmal getestet was passiert, wenn du $t->see(5, 10) machst?

MfG PerlProfi
<< >> 8 Einträge, 1 Seite



View all threads created 2007-01-23 16:50.